mirror of
https://github.com/rjNemo/villafleurie
synced 2026-06-12 13:26:47 +00:00
CHecks for availabiliy before creating reservation
This commit is contained in:
parent
be7bdec84f
commit
1527da9fd3
5 changed files with 100 additions and 29 deletions
|
|
@ -79,8 +79,7 @@ Le visiteur doit pouvoir :
|
||||||
|
|
||||||
- Page service : navette + location
|
- Page service : navette + location
|
||||||
- Gestion du calendrier
|
- Gestion du calendrier
|
||||||
.._ Google calendar pour afficher les disponibilités
|
..\_ Google calendar pour afficher les disponibilités
|
||||||
.._ Check si les dates choisies sont libres
|
|
||||||
- Envoyer devis réservation par mail et notification aux hôtes
|
- Envoyer devis réservation par mail et notification aux hôtes
|
||||||
- Ajout page/module de paiement
|
- Ajout page/module de paiement
|
||||||
- ajouter les témoignages depuis Booking, AirBnb, ajouter le lien
|
- ajouter les témoignages depuis Booking, AirBnb, ajouter le lien
|
||||||
|
|
|
||||||
17
rental/calendar.py
Normal file
17
rental/calendar.py
Normal file
|
|
@ -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
|
||||||
25
rental/templates/rental/calendar.html
Normal file
25
rental/templates/rental/calendar.html
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
{% extends 'rental/base.html' %} {% block content %}
|
||||||
|
<section class="intro-single">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12 col-lg-8">
|
||||||
|
<div class="title-single-box">
|
||||||
|
<h1 class="title-single">
|
||||||
|
Calendrier {{place_name}}
|
||||||
|
</h1>
|
||||||
|
{% for booking in bookings %}
|
||||||
|
<h2 class="title-d">
|
||||||
|
{{booking.guest.name}}
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Réservation du {{booking.start}} au {{booking.end}}</li>
|
||||||
|
<li>Montant : {{booking.price}} €</li>
|
||||||
|
<li>Message : {{booking.message}}</li>
|
||||||
|
</ul>
|
||||||
|
{%endfor%}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{%endblock%}
|
||||||
|
|
@ -12,6 +12,7 @@ urlpatterns = [
|
||||||
path('hebergements/', views.liste_location, name='list_place'),
|
path('hebergements/', views.liste_location, name='list_place'),
|
||||||
# path('<place_name>/', views.Location.as_view(), name='detail_place'),
|
# path('<place_name>/', views.Location.as_view(), name='detail_place'),
|
||||||
path('<place_name>/', views.location, name='detail_place'),
|
path('<place_name>/', views.location, name='detail_place'),
|
||||||
|
path('calendar/<place_name>/', views.calendar, name='calendar')
|
||||||
]
|
]
|
||||||
|
|
||||||
urlpatterns += staticfiles_urlpatterns()
|
urlpatterns += staticfiles_urlpatterns()
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ from django.views.generic.base import TemplateView
|
||||||
from .forms import ReservationForm
|
from .forms import ReservationForm
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from rental.pricing import get_reservation_price
|
from rental.pricing import get_reservation_price
|
||||||
|
from rental.calendar import check_availability
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
|
|
@ -54,25 +55,31 @@ def location(request, place_name='T2'):
|
||||||
if not guest.exists():
|
if not guest.exists():
|
||||||
guest = Guest.objects.create(
|
guest = Guest.objects.create(
|
||||||
email=email,
|
email=email,
|
||||||
name=name
|
name=name,
|
||||||
|
phone=phone
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
guest = guest.first()
|
guest = guest.first()
|
||||||
|
|
||||||
place = get_object_or_404(Place, name=place_name)
|
place = get_object_or_404(Place, name=place_name)
|
||||||
price = get_reservation_price(place, start, end)
|
available = check_availability(place, start, end)
|
||||||
reservation = Reservation.objects.create(
|
if available:
|
||||||
guest=guest,
|
price = get_reservation_price(place, start, end)
|
||||||
place=place,
|
reservation = Reservation.objects.create(
|
||||||
message=message,
|
guest=guest,
|
||||||
start=start,
|
place=place,
|
||||||
end=end,
|
message=message,
|
||||||
price=price
|
start=start,
|
||||||
)
|
end=end,
|
||||||
context = {
|
price=price
|
||||||
'reservation': reservation
|
)
|
||||||
}
|
context = {
|
||||||
return render(request, 'rental/merci.html', context)
|
'reservation': reservation
|
||||||
|
}
|
||||||
|
return render(request, 'rental/merci.html', context)
|
||||||
|
else:
|
||||||
|
context = {'form': form}
|
||||||
|
return render(request, 'rental/reservation.html', context)
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
form.errors['internal'] = "Une erreur interne est apparue. \
|
form.errors['internal'] = "Une erreur interne est apparue. \
|
||||||
Merci de recommencer votre requête."
|
Merci de recommencer votre requête."
|
||||||
|
|
@ -100,23 +107,30 @@ def reservation(request):
|
||||||
if not guest.exists():
|
if not guest.exists():
|
||||||
guest = Guest.objects.create(
|
guest = Guest.objects.create(
|
||||||
email=email,
|
email=email,
|
||||||
name=name
|
name=name,
|
||||||
|
phone=phone
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
guest = guest.first()
|
guest = guest.first()
|
||||||
place = get_object_or_404(Place, name=place_name)
|
place = get_object_or_404(Place, name=place_name)
|
||||||
reservation = Reservation.objects.create(
|
available = check_availability(place, start, end)
|
||||||
guest=guest,
|
price = get_reservation_price(place, start, end)
|
||||||
place=place,
|
if available:
|
||||||
message=message,
|
reservation = Reservation.objects.create(
|
||||||
start=start,
|
guest=guest,
|
||||||
end=end
|
place=place,
|
||||||
)
|
message=message,
|
||||||
context = {
|
start=start,
|
||||||
'guest': guest,
|
end=end,
|
||||||
'place': place
|
price=price
|
||||||
}
|
)
|
||||||
return render(request, 'rental/merci.html', context)
|
context = {
|
||||||
|
'reservation': reservation
|
||||||
|
}
|
||||||
|
return render(request, 'rental/merci.html', context)
|
||||||
|
else:
|
||||||
|
context = {'form': form}
|
||||||
|
return render(request, 'rental/reservation.html', context)
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
form.errors['internal'] = "Une erreur interne est apparue. Merci de recommencer votre requête."
|
form.errors['internal'] = "Une erreur interne est apparue. Merci de recommencer votre requête."
|
||||||
else:
|
else:
|
||||||
|
|
@ -126,6 +140,21 @@ def reservation(request):
|
||||||
return render(request, 'rental/reservation.html', context)
|
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):
|
class Contact(TemplateView):
|
||||||
template_name = 'rental/contact.html'
|
template_name = 'rental/contact.html'
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue