mirror of
https://github.com/rjNemo/villafleurie
synced 2026-06-12 13:26:47 +00:00
Synchronizes to MasterCalendar when new booking to avoid overbooking. Checks for duplicates also
This commit is contained in:
parent
3a33d1f34d
commit
584e11d2b0
4 changed files with 79 additions and 84 deletions
|
|
@ -86,7 +86,7 @@ Le visiteur doit pouvoir :
|
||||||
- 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
|
||||||
- changer la couleur des liens hypertextes
|
- changer la couleur des liens hypertextes
|
||||||
- changer l'adresse de l'admin, personnaliser le back-end
|
- changer l'adresse de l'admin, personnaliser le back-end (design et les infos displayed per model)
|
||||||
- ajouter un diaporama en bas de page de location ?
|
- ajouter un diaporama en bas de page de location ?
|
||||||
- deploy on Heroku or somewhere else … don't care
|
- deploy on Heroku or somewhere else … don't care
|
||||||
- change placeholders for dates, add a date picker
|
- change placeholders for dates, add a date picker
|
||||||
|
|
@ -98,8 +98,11 @@ Le visiteur doit pouvoir :
|
||||||
- configure nginx server to serve media files
|
- configure nginx server to serve media files
|
||||||
- Centrer Bouton "Reserver" page location
|
- Centrer Bouton "Reserver" page location
|
||||||
- Ajouter un titre "Disponibilités" au dessus du calendrier
|
- Ajouter un titre "Disponibilités" au dessus du calendrier
|
||||||
- page réservation : égayer avec des petites photos …
|
- page réservation/services : égayer avec des petites photos …
|
||||||
|
- Are guest unique ?
|
||||||
|
|
||||||
## BUGS
|
## BUGS
|
||||||
|
|
||||||
- La synchro ne gère pas les heures dans le calendriers.
|
- La synchro ne gère pas les heures dans le calendriers.
|
||||||
|
|
||||||
|
élminer les variables inutiles dans synchro_calendar
|
||||||
|
|
|
||||||
|
|
@ -11,26 +11,7 @@ import pickle
|
||||||
from villafleurie.settings import BASE_DIR
|
from villafleurie.settings import BASE_DIR
|
||||||
|
|
||||||
|
|
||||||
def get_bookings(place):
|
def synchronize_calendars(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
|
|
||||||
|
|
||||||
|
|
||||||
def synchronize_calendars():
|
|
||||||
"""
|
"""
|
||||||
Get a complete list of existing bookings in calendar
|
Get a complete list of existing bookings in calendar
|
||||||
Creates reservation if not in db, update if already in db
|
Creates reservation if not in db, update if already in db
|
||||||
|
|
@ -59,74 +40,85 @@ def synchronize_calendars():
|
||||||
pickle.dump(creds, token)
|
pickle.dump(creds, token)
|
||||||
|
|
||||||
service = build('calendar', 'v3', credentials=creds)
|
service = build('calendar', 'v3', credentials=creds)
|
||||||
|
calendar = place.name
|
||||||
calendars = {
|
calendars = {
|
||||||
'T2': "burik7aclvhc7vsboh06c179uo@group.calendar.google.com",
|
'T2': "burik7aclvhc7vsboh06c179uo@group.calendar.google.com",
|
||||||
'T3': "fu7h30p0gk4a2p4nvo7nsbgpok@group.calendar.google.com"
|
'T3': "fu7h30p0gk4a2p4nvo7nsbgpok@group.calendar.google.com"
|
||||||
}
|
}
|
||||||
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
|
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
|
||||||
|
|
||||||
for calendar in calendars:
|
# for calendar in calendars:
|
||||||
print(f"Upcoming {calendar} events:")
|
events_result = service.events().list(
|
||||||
events_result = service.events().list(
|
calendarId=calendars[calendar],
|
||||||
calendarId=calendars[calendar],
|
timeMin=now,
|
||||||
timeMin=now,
|
singleEvents=True,
|
||||||
singleEvents=True,
|
orderBy='startTime'
|
||||||
orderBy='startTime').execute()
|
).execute()
|
||||||
events = events_result.get('items', [])
|
events = events_result.get('items', [])
|
||||||
if not events:
|
if not events:
|
||||||
print('No upcoming events found.')
|
print('No upcoming events found.')
|
||||||
else:
|
else:
|
||||||
for event in events:
|
for event in events:
|
||||||
reservation = {
|
reservation = {
|
||||||
'place': calendar,
|
'place': calendar.strip(),
|
||||||
'guest': event['summary'],
|
'guest': event['summary'].strip(),
|
||||||
'start': event['start'].get('dateTime', event['start'].get('date')),
|
'start': event['start'].get('dateTime', event['start'].get('date')).strip(),
|
||||||
'end': event['end'].get('dateTime', event['end'].get('date'))
|
'end': event['end'].get('dateTime', event['end'].get('date')).strip()
|
||||||
}
|
}
|
||||||
print(reservation)
|
|
||||||
|
|
||||||
# if booking not in db -> create
|
place = get_object_or_404(Place, name=calendar)
|
||||||
# if booking in db and modification_date_cal > update_date_db -> update
|
price = get_reservation_price(
|
||||||
# try : create/update
|
place, reservation['start'], reservation['end'])
|
||||||
# except : send a log message
|
start = reservation['start']
|
||||||
try:
|
end = reservation['end']
|
||||||
place = get_object_or_404(Place, name=calendar)
|
|
||||||
price = get_reservation_price(
|
|
||||||
place, reservation['start'], reservation['end'])
|
|
||||||
|
|
||||||
guest = Guest.objects.filter(name=reservation['guest'])
|
guest = Guest.objects.filter(name=reservation['guest'])
|
||||||
if not guest.exists():
|
if not guest.exists():
|
||||||
guest = Guest.objects.create(name=reservation['guest'])
|
guest = Guest.objects.create(name=reservation['guest'])
|
||||||
|
else:
|
||||||
|
# guest = guest[0]
|
||||||
|
guest = guest.first()
|
||||||
|
|
||||||
start = reservation['start']
|
db_booking = Reservation.objects.filter(
|
||||||
end = reservation['end']
|
guest=guest
|
||||||
|
)
|
||||||
|
|
||||||
# print("here")
|
if not db_booking.exists():
|
||||||
|
Reservation.objects.create(
|
||||||
|
place=place,
|
||||||
|
guest=guest,
|
||||||
|
start=start,
|
||||||
|
end=end,
|
||||||
|
price=price
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
db_booking.place = place,
|
||||||
|
db_booking.guest = guest,
|
||||||
|
db_booking.start = start,
|
||||||
|
db_booking.end = end,
|
||||||
|
db_booking.price = price
|
||||||
|
|
||||||
# db_booking = Reservation.objects.filter(
|
|
||||||
# guest=guest,
|
def get_bookings(place):
|
||||||
# # place=place,
|
"""
|
||||||
# # start=start
|
Synchronize with Master calendar via a call to synchronize_calendar
|
||||||
# )
|
Returns a list of all related place reservations
|
||||||
# print("there")
|
"""
|
||||||
db_booking = None
|
synchronize_calendars(place)
|
||||||
if not db_booking.exists():
|
booked_dates = Reservation.objects.filter(place=place)
|
||||||
print("yo")
|
# if booking.place.name == f"{place.name}"]
|
||||||
Reservation.objects.create(
|
return [booking for booking in booked_dates]
|
||||||
place=place,
|
|
||||||
guest=guest,
|
|
||||||
start=start,
|
def check_availability(place, start_date, end_date):
|
||||||
end=end,
|
"""
|
||||||
price=price)
|
check if the related place is available during a given period
|
||||||
else:
|
"""
|
||||||
db_booking = Reservation.objects.filter(
|
bookings = get_bookings(place)
|
||||||
guest=reservation['guest'],
|
for booking in bookings:
|
||||||
place=place,
|
if (booking.start <= start_date <= booking.end) or (booking.start <= end_date <= booking.end):
|
||||||
start=start
|
return False
|
||||||
)
|
return True
|
||||||
except:
|
|
||||||
print(
|
|
||||||
f"######## ERROR ! Can't create {guest} reservation ########")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,10 @@ def get_reservation_price(place, start, end):
|
||||||
"""
|
"""
|
||||||
Compute booking price as a function of place and dates
|
Compute booking price as a function of place and dates
|
||||||
"""
|
"""
|
||||||
start = datetime.strptime(start, '%Y-%m-%d')
|
if type(start) == str:
|
||||||
end = datetime.strptime(end, '%Y-%m-%d')
|
start = datetime.strptime(start, '%Y-%m-%d')
|
||||||
|
if type(end) == str:
|
||||||
|
end = datetime.strptime(end, '%Y-%m-%d')
|
||||||
nights = (end - start).days
|
nights = (end - start).days
|
||||||
return place.price * nights
|
return place.price * nights
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,11 +143,10 @@ def calendar(request, place_name):
|
||||||
"""
|
"""
|
||||||
returns a list of all related place reservations
|
returns a list of all related place reservations
|
||||||
"""
|
"""
|
||||||
synchronize_calendars()
|
# synchronize_calendars()
|
||||||
booked_dates = Reservation.objects.all()
|
booked_dates = Reservation.objects.all()
|
||||||
bookings = [
|
bookings = [
|
||||||
booking for booking in booked_dates if booking.place.name == place_name]
|
booking for booking in booked_dates if booking.place.name == place_name]
|
||||||
# synchronize_calendars(sys.argv)
|
|
||||||
context = {
|
context = {
|
||||||
'place_name': place_name,
|
'place_name': place_name,
|
||||||
'bookings': bookings
|
'bookings': bookings
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue