diff --git a/README.md b/README.md index f2f5c96..bbeeb4a 100644 --- a/README.md +++ b/README.md @@ -79,8 +79,7 @@ Le visiteur doit pouvoir : - Page service : navette + location - Gestion du calendrier - .._ Google calendar pour afficher les disponibilités - .._ Check si les dates choisies sont libres + ..\_ Google calendar pour afficher les disponibilités - Envoyer devis réservation par mail et notification aux hôtes - Ajout page/module de paiement - ajouter les témoignages depuis Booking, AirBnb, ajouter le lien diff --git a/rental/calendar.py b/rental/calendar.py new file mode 100644 index 0000000..b738bea --- /dev/null +++ b/rental/calendar.py @@ -0,0 +1,17 @@ +def get_bookings(place): + """ + returns a list of all related place reservations + """ + booked_dates = Reservation.objects.all() + return [booking for booking in booked_dates if booking.place.name == f"{place.name}"] + + +def check_availability(place, start_date, end_date): + """ + check if the related place is available during a given period + """ + bookings = get_bookings(place) + for booking in bookings: + if (booking.start <= start_date <= booking.end) or (booking.start <= end_date <= booking.end): + return False + return True diff --git a/rental/templates/rental/calendar.html b/rental/templates/rental/calendar.html new file mode 100644 index 0000000..f548ad8 --- /dev/null +++ b/rental/templates/rental/calendar.html @@ -0,0 +1,25 @@ +{% extends 'rental/base.html' %} {% block content %} +
+
+
+
+
+

+ Calendrier {{place_name}} +

+ {% for booking in bookings %} +

+ {{booking.guest.name}} +

+
    +
  • Réservation du {{booking.start}} au {{booking.end}}
  • +
  • Montant : {{booking.price}} €
  • +
  • Message : {{booking.message}}
  • +
+ {%endfor%} +
+
+
+
+
+{%endblock%} diff --git a/rental/urls.py b/rental/urls.py index 0a9b32a..2ae9f16 100644 --- a/rental/urls.py +++ b/rental/urls.py @@ -12,6 +12,7 @@ urlpatterns = [ path('hebergements/', views.liste_location, name='list_place'), # path('/', views.Location.as_view(), name='detail_place'), path('/', views.location, name='detail_place'), + path('calendar//', views.calendar, name='calendar') ] urlpatterns += staticfiles_urlpatterns() diff --git a/rental/views.py b/rental/views.py index 57eb74a..50d9e97 100644 --- a/rental/views.py +++ b/rental/views.py @@ -6,6 +6,7 @@ from django.views.generic.base import TemplateView from .forms import ReservationForm from django.db import IntegrityError from rental.pricing import get_reservation_price +from rental.calendar import check_availability def index(request): @@ -54,25 +55,31 @@ def location(request, place_name='T2'): if not guest.exists(): guest = Guest.objects.create( email=email, - name=name + name=name, + phone=phone ) else: guest = guest.first() place = get_object_or_404(Place, name=place_name) - price = get_reservation_price(place, start, end) - reservation = Reservation.objects.create( - guest=guest, - place=place, - message=message, - start=start, - end=end, - price=price - ) - context = { - 'reservation': reservation - } - return render(request, 'rental/merci.html', context) + available = check_availability(place, start, end) + if available: + price = get_reservation_price(place, start, end) + reservation = Reservation.objects.create( + guest=guest, + place=place, + message=message, + start=start, + end=end, + price=price + ) + context = { + 'reservation': reservation + } + return render(request, 'rental/merci.html', context) + else: + context = {'form': form} + return render(request, 'rental/reservation.html', context) except IntegrityError: form.errors['internal'] = "Une erreur interne est apparue. \ Merci de recommencer votre requête." @@ -100,23 +107,30 @@ def reservation(request): if not guest.exists(): guest = Guest.objects.create( email=email, - name=name + name=name, + phone=phone ) else: guest = guest.first() place = get_object_or_404(Place, name=place_name) - reservation = Reservation.objects.create( - guest=guest, - place=place, - message=message, - start=start, - end=end - ) - context = { - 'guest': guest, - 'place': place - } - return render(request, 'rental/merci.html', context) + available = check_availability(place, start, end) + price = get_reservation_price(place, start, end) + if available: + reservation = Reservation.objects.create( + guest=guest, + place=place, + message=message, + start=start, + end=end, + price=price + ) + context = { + 'reservation': reservation + } + return render(request, 'rental/merci.html', context) + else: + context = {'form': form} + return render(request, 'rental/reservation.html', context) except IntegrityError: form.errors['internal'] = "Une erreur interne est apparue. Merci de recommencer votre requête." else: @@ -126,6 +140,21 @@ def reservation(request): return render(request, 'rental/reservation.html', context) +def calendar(request, place_name): + """ + returns a list of all related place reservations + """ + booked_dates = Reservation.objects.all() + bookings = [ + booking for booking in booked_dates if booking.place.name == place_name] + print(place_name) + context = { + 'place_name': place_name, + 'bookings': bookings + } + return render(request, 'rental/calendar.html', context) + + class Contact(TemplateView): template_name = 'rental/contact.html'