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
10 changes: 10 additions & 0 deletions pms/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,13 @@ class Meta:
'total': forms.HiddenInput(),
'state': forms.HiddenInput(),
}

class EditBookingDatesForm(forms.ModelForm):
class Meta:
model = Booking
fields = ['checkin','checkout']
widgets = {
'checkin': forms.DateInput(attrs={'type': 'date', 'class':'form-control'}),
'checkout': forms.DateInput(attrs={'type': 'date', 'class':'form-control'})
}

15 changes: 15 additions & 0 deletions pms/templates/edit_booking_date.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{% extends "main.html"%} {% block content %}
<h1>Editar fecha de la reserva: {{ booking.code }}</h1>
<div class="card card-body mt-3">
{% if messages %} {% for message in messages %}
<div class="alert alert-danger">{{message}}</div>
{% endfor %} {% endif %}

<form method="POST">
{% csrf_token %} {{ form.as_p }}
<button type="submit" class="btn btn-primary">Guardar</button>
<a href="{% url 'home' %}" class="btn btn-secondary">Cancelar</a>
</form>
</div>

{% endblock content%}
2 changes: 1 addition & 1 deletion pms/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ <h3>Reservas Realizadas</h3>
<a href="{% url 'edit_booking' pk=booking.id%} " >Editar datos de contacto</a>
</div>
<div class="col">

<a href="{% url 'edit_booking_date' pk=booking.id%} " >Editar fecha de la reserva</a>
</div>
<div class="col">

Expand Down
64 changes: 63 additions & 1 deletion pms/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,65 @@
from django.test import TestCase
from django.test import TestCase, override_settings
from django.urls import reverse
from .models import Room, Room_type, Booking, Customer
import datetime

# Create your tests here.

@override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage')
class EditBookingDatesTest(TestCase):
def setUp(self):
self.room_type = Room_type.objects.create(name='Simple', price=20, max_guests=1)
self.room = Room.objects.create(room_type=self.room_type, name='Room 7.1', description='descripcion')
self.customer = Customer.objects.create(name="Cliente1", email="cliente1@test.com", phone="123123123")

self.booking1 = Booking.objects.create(
state='NEW',
checkin=datetime.date(2026, 7, 10),
checkout=datetime.date(2026, 7, 12),
room=self.room,
guests=1,
customer=self.customer,
total=40,
code='B1'
)

self.booking2 = Booking.objects.create(
state='NEW',
checkin=datetime.date(2026, 7, 15),
checkout=datetime.date(2026, 7, 20),
room=self.room,
guests=1,
customer=self.customer,
total=100,
code='B2'
)

"""Valida que se realiza el cambio de fecha correctamente."""
def test_succesful_date_change(self):
url = reverse('edit_booking_date', kwargs={'pk': self.booking2.id})

data = {
'checkin': '2026-12-26',
'checkout': '2026-12-30'
}

response = self.client.post(url, data)

self.booking2.refresh_from_db()
self.assertEqual(self.booking2.checkin, datetime.date(2026, 12, 26))
self.assertRedirects(response, reverse('home'))

"""Valida que si se solapan las fechas con otra reserva, de error."""
def test_overlap_validation_error(self):
url = reverse('edit_booking_date', kwargs={'pk': self.booking2.id})

data = {
'checkin': '2026-7-11',
'checkout': '2026-7-15'
}

response = self.client.post(url, data)
self.assertContains(response, "No hay disponibilidad para las fechas seleccionadas.")
self.booking2.refresh_from_db()
self.assertEqual(self.booking2.checkin, datetime.date(2026, 7, 15))

3 changes: 2 additions & 1 deletion pms/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@
path("booking/<str:pk>/delete", views.DeleteBookingView.as_view(), name="delete_booking"),
path("rooms/", views.RoomsView.as_view(), name="rooms"),
path("room/<str:pk>/", views.RoomDetailsView.as_view(), name="room_details"),
path("dashboard/", views.DashboardView.as_view(), name="dashboard")
path("dashboard/", views.DashboardView.as_view(), name="dashboard"),
path("booking/<str:pk>/edit-dates/", views.EditBookingDatesView.as_view(), name="edit_booking_date")
]
32 changes: 31 additions & 1 deletion pms/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django.db.models import F, Q, Count, Sum
from django.shortcuts import render, redirect
from django.shortcuts import render, redirect, get_object_or_404
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import ensure_csrf_cookie
from django.contrib import messages

from .form_dates import Ymd
from .forms import *
Expand Down Expand Up @@ -244,3 +245,32 @@ def get(self, request):
'rooms': rooms
}
return render(request, "rooms.html", context)


class EditBookingDatesView(View):
def get(self, request, pk):
booking = get_object_or_404(Booking, id=pk)
form = EditBookingDatesForm(prefix="booking", instance=booking)
return render(request, "edit_booking_date.html", {'form': form, 'booking': booking})

def post(self, request, pk):
booking = get_object_or_404(Booking, id=pk)
form = EditBookingDatesForm(request.POST, instance=booking)

if form.is_valid():
new_checkin = form.cleaned_data['checkin']
new_checkout = form.cleaned_data['checkout']

overlap = Booking.objects.filter(
room=booking.room, state='NEW'
).exclude(id=pk).filter(Q(checkin__lt=new_checkout, checkout__gt=new_checkin)
).exists()

if overlap:
messages.error(request, "No hay disponibilidad para las fechas seleccionadas.")
return render(request, "edit_booking_date.html", {'form': form, 'booking': booking})

form.save()
return redirect("home")

return render(request, "edit_booking_date.html", {'form': form, 'booking': booking})