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
19 changes: 17 additions & 2 deletions pms/templates/rooms.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

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

<form method="get" action="{% url 'rooms' %}" class="mb-3">
<div class="input-group">
<input type="text" name="name" class="form-control" placeholder="Buscar por nombre de habitación" value="{{ search_query }}">
<button type="submit" class="btn btn-primary">Buscar</button>
{% if search_query %}
<a href="{% url 'rooms' %}" class="btn btn-outline-secondary">Limpiar</a>
{% endif %}
</div>
</form>

{% if rooms|length == 0 %}
<div class="alert alert-warning">No se encontraron habitaciones.</div>
{% endif %}

{% for room in rooms%}
<div class="row card mt-3 mb-3 hover-card bg-tr-250">
<div class="col p-3">
Expand All @@ -11,9 +26,9 @@ <h1>Habitaciones del hotel</h1>
<div>
<a href="{% url 'room_details' pk=room.id%}">Ver detalles</a>
</div>

</div>

</div>
{% endfor %}
{% endblock content%}
46 changes: 44 additions & 2 deletions pms/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,45 @@
from django.test import TestCase
from django.test import TestCase, Client
from django.urls import reverse

# Create your tests here.
from .models import Room, Room_type


class RoomsViewFilterTest(TestCase):
def setUp(self):
self.client = Client()
self.room_type = Room_type.objects.create(name="Individual", price=20, max_guests=1)
Room.objects.create(name="Room 1.1", room_type=self.room_type, description="")
Room.objects.create(name="Room 1.2", room_type=self.room_type, description="")
Room.objects.create(name="Room 2.1", room_type=self.room_type, description="")

def test_rooms_list_shows_all_rooms(self):
response = self.client.get(reverse("rooms"))
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.context["rooms"]), 3)

def test_filter_by_name_contains(self):
response = self.client.get(reverse("rooms"), {"name": "Room 1"})
self.assertEqual(response.status_code, 200)
rooms = response.context["rooms"]
self.assertEqual(len(rooms), 2)
names = [r["name"] for r in rooms]
self.assertIn("Room 1.1", names)
self.assertIn("Room 1.2", names)
self.assertNotIn("Room 2.1", names)

def test_filter_is_case_insensitive(self):
response = self.client.get(reverse("rooms"), {"name": "room 1"})
self.assertEqual(len(response.context["rooms"]), 2)

def test_filter_no_results(self):
response = self.client.get(reverse("rooms"), {"name": "Room 9"})
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.context["rooms"]), 0)

def test_empty_filter_returns_all(self):
response = self.client.get(reverse("rooms"), {"name": ""})
self.assertEqual(len(response.context["rooms"]), 3)

def test_search_query_in_context(self):
response = self.client.get(reverse("rooms"), {"name": "Room 1"})
self.assertEqual(response.context["search_query"], "Room 1")
11 changes: 8 additions & 3 deletions pms/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,9 +238,14 @@ 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")
# renders a list of rooms, optionally filtered by name
rooms = Room.objects.all()
query = request.GET.get("name", "").strip()
if query:
rooms = rooms.filter(name__icontains=query)
rooms = rooms.values("name", "room_type__name", "id")
context = {
'rooms': rooms
'rooms': rooms,
'search_query': query,
}
return render(request, "rooms.html", context)