Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
*/__pycache__/**
# Python
__pycache__/
*.py[cod]

# IDE
.idea/
10 changes: 10 additions & 0 deletions pms/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ class Meta:
}


class RoomFilterForm(forms.Form):
name = forms.CharField(
required=False,
label="Nombre",
widget=forms.TextInput(
attrs={"placeholder": "Nombre de la habitación"}
),
)


class CustomerForm(ModelForm):
class Meta:
model = Customer
Expand Down
14 changes: 14 additions & 0 deletions pms/templates/rooms.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@

{% block content %}
<h1>Habitaciones del hotel</h1>

<form method="get" class="mb-3">
<div class="row">
<div class="col">
{{ form.name }}
<button type="submit" class="btn btn-primary">Filtrar</button>
<a href="{% url 'rooms' %}" class="btn btn-secondary">Limpiar</a>
</div>
</div>
</form>

{% for room in rooms%}
<div class="row card mt-3 mb-3 hover-card bg-tr-250">
<div class="col p-3">
Expand All @@ -15,5 +26,8 @@ <h1>Habitaciones del hotel</h1>
</div>

</div>

{% empty %}
<p>No se encontraron habitaciones.</p>
{% endfor %}
{% endblock content%}
76 changes: 74 additions & 2 deletions pms/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,75 @@
from django.test import TestCase
from django.test import TestCase, override_settings
from django.urls import reverse

# Create your tests here.
from .models import Room

@override_settings(STATICFILES_STORAGE="django.contrib.staticfiles.storage.StaticFilesStorage")
class RoomsViewFilterTests(TestCase):
"""
Tests for the room list filter functionality.

Static files storage is overridden per-class to avoid requiring
collectstatic before running tests. A project-wide test settings
file would be the cleaner long-term solution.
"""

@classmethod
def setUpTestData(cls):
cls.rooms_url = reverse("rooms")

cls.matching_room_one = Room.objects.create(name="Room 1.1")
cls.matching_room_two = Room.objects.create(name="Room 1.2")
cls.non_matching_room = Room.objects.create(name="Room 2.1")

def test_rooms_page_renders_filter_form(self):
response = self.client.get(self.rooms_url)

self.assertEqual(response.status_code, 200)
self.assertContains(response, 'method="get"', html=False)
self.assertContains(response, 'name="name"', html=False)

def test_rooms_page_without_name_filter_returns_all_rooms(self):
response = self.client.get(self.rooms_url)

self.assertEqual(response.status_code, 200)
self.assertContains(response, self.matching_room_one.name)
self.assertContains(response, self.matching_room_two.name)
self.assertContains(response, self.non_matching_room.name)

def test_rooms_page_filters_rooms_by_partial_name(self):
response = self.client.get(self.rooms_url, {"name": "Room 1"})

self.assertEqual(response.status_code, 200)
self.assertContains(response, self.matching_room_one.name)
self.assertContains(response, self.matching_room_two.name)
self.assertNotContains(response, self.non_matching_room.name)

def test_rooms_page_filters_rooms_case_insensitively(self):
response = self.client.get(self.rooms_url, {"name": "room 1"})

self.assertEqual(response.status_code, 200)
self.assertContains(response, self.matching_room_one.name)
self.assertContains(response, self.matching_room_two.name)
self.assertNotContains(response, self.non_matching_room.name)

def test_rooms_page_with_non_matching_name_returns_no_rooms(self):
response = self.client.get(self.rooms_url, {"name": "Suite"})

self.assertEqual(response.status_code, 200)
self.assertNotContains(response, self.matching_room_one.name)
self.assertNotContains(response, self.matching_room_two.name)
self.assertNotContains(response, self.non_matching_room.name)

def test_rooms_page_ignores_whitespace_only_name_filter(self):
response = self.client.get(self.rooms_url, {"name": " "})

self.assertEqual(response.status_code, 200)
self.assertContains(response, self.matching_room_one.name)
self.assertContains(response, self.matching_room_two.name)
self.assertContains(response, self.non_matching_room.name)

def test_rooms_page_preserves_name_filter_in_form(self):
response = self.client.get(self.rooms_url, {"name": "Room 1"})

self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["form"]["name"].value(), "Room 1")
15 changes: 12 additions & 3 deletions pms/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,9 +238,18 @@ def get(self, request, pk):

class RoomsView(View):
def get(self, request):
# renders a list of rooms
rooms = Room.objects.all().values("name", "room_type__name", "id")
form = RoomFilterForm(request.GET or None)
rooms_qs = Room.objects.all().order_by("name", "id")

if form.is_valid():
name = (form.cleaned_data.get("name") or "").strip()
if name:
rooms_qs = rooms_qs.filter(name__icontains=name)

rooms = rooms_qs.values("name", "room_type__name", "id")

context = {
'rooms': rooms
"rooms": rooms,
"form": form,
}
return render(request, "rooms.html", context)