From 8695c988a63e3ef88641f587de62e6d11eb19ca8 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Mon, 9 Dec 2019 15:05:05 +0100 Subject: [PATCH] minor update of booking system --- README.md | 10 +++-- rental/bookings.py | 99 +++++++++++++++++++++++++++------------------- requirements.txt | 27 +++++++++++++ 3 files changed, 91 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 1ebe865..92495ff 100644 --- a/README.md +++ b/README.md @@ -80,17 +80,19 @@ Le visiteur doit pouvoir : - Page service : navette + location - Gestion du calendrier - ..\_ Synchroniser avec Google calendar - ..\_ Afficher les disponibilités + ..\_ Synchroniser avec Google calendar (qd Calendar mis à jour => update db et quand db mise à jour => update calendrier) + ..\_ Afficher les disponibilités (Présentation à la hauteur) + ..\_ Ajouter un date picker dans le formulaire de réservation - 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 - changer la couleur des liens hypertextes -- changer l'adresse de l'admin +- changer l'adresse de l'admin, personnaliser le back-end - ajouter un diaporama en bas de page de location ? - deploy on Heroku or somewhere else … don't care - change placeholders for dates, add a date picker - factoriser le code de réservation -- formulaire de réservation : les apparts sont hard codés rendre ça dynamique +- formulaire de réservation : les apparts sont hard codés rendre ça dynamique (use choicefields) + \_ nettoyer les statics files. Garder que les définitions utiles ## BUGS diff --git a/rental/bookings.py b/rental/bookings.py index 059c5d5..73e2593 100644 --- a/rental/bookings.py +++ b/rental/bookings.py @@ -1,17 +1,13 @@ -import sys -from googleapiclient import sample_tools import datetime from rental.pricing import get_reservation_price from django.shortcuts import get_object_or_404 from rental.models import Reservation, Place - -# from __future__ import print_function -# from google.auth.transport.requests import Request -# from google_auth_oauthlib.flow import InstalledAppFlow -# from googleapiclient.discovery import build -# import os.path -# import pickle -# from oauth2client import client +import datetime +from google.auth.transport.requests import Request +from google_auth_oauthlib.flow import InstalledAppFlow +from googleapiclient.discovery import build +import os.path +import pickle def get_bookings(place): @@ -33,20 +29,38 @@ def check_availability(place, start_date, end_date): return True -def synchronize_calendars(argv): +def synchronize_calendars(): """ - Simple command-line sample for the Calendar API. - Command-line application that retrieves the list of calendars' events + Get a complete list of existing bookings in calendar + Creates reservation if not in db, update if already in db + Delete from db reservation deleted from cal """ - service, _ = sample_tools.init( - argv, 'calendar', 'v3', __doc__, __file__, - scope='https://www.googleapis.com/auth/calendar.readonly') + creds = None + # If modifying these scopes, delete the file token.pickle. + SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'] + # The file token.pickle stores the user's access and refresh tokens, and is + # created automatically when the authorization flow completes for the first + # time. + if os.path.exists('token.pickle'): + with open('token.pickle', 'rb') as token: + creds = pickle.load(token) + # If there are no (valid) credentials available, let the user log in. + if not creds or not creds.valid: + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + else: + flow = InstalledAppFlow.from_client_secrets_file( + 'client_secrets.json', scopes=SCOPES, redirect_uri="http://localhost:8080/") + creds = flow.run_local_server() + # Save the credentials for the next run + with open('token.pickle', 'wb') as token: + pickle.dump(creds, token) + service = build('calendar', 'v3', credentials=creds) calendars = { 'T2': "burik7aclvhc7vsboh06c179uo@group.calendar.google.com", 'T3': "fu7h30p0gk4a2p4nvo7nsbgpok@group.calendar.google.com" } - now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time for calendar in calendars: @@ -57,33 +71,36 @@ def synchronize_calendars(argv): singleEvents=True, orderBy='startTime').execute() events = events_result.get('items', []) - reservation = {} if not events: print('No upcoming events found.') - for index, event in enumerate(events): - # start = event['start'].get('dateTime', event['start'].get('date')) - # end = event['end'].get('dateTime', event['end'].get('date')) - # print(start, end, event['summary']) - reservation[index] = { - 'place': calendar, - 'guest': event['summary'], - 'start': event['start'].get('dateTime', event['start'].get('date')), - 'end': event['end'].get('dateTime', event['end'].get('date')) - } - print(reservation[index]) - place = get_object_or_404(Place, name=calendar) - price = get_reservation_price( - place, reservation['start'], reservation['end']) - guest = Guest.objects.create(name=reservation['guest']) + else: + reservation = {} + for index, event in enumerate(events): + reservation[index] = { + 'place': calendar, + 'guest': event['summary'], + 'start': event['start'].get('dateTime', event['start'].get('date')), + 'end': event['end'].get('dateTime', event['end'].get('date')) + } + print(reservation[index]) - Reservation.objects.create( - place=place, - guest=guest, - start=start, - end=end, - price=price - ) +# if booking not in db -> create +# if booking in db and modification_date_cal > update_date_db -> update + + place = get_object_or_404(Place, name=calendar) + price = get_reservation_price( + place, reservation['start'], reservation['end']) + # trouver si guest existe déjà, créer sinon + guest = Guest.objects.create(name=reservation['guest']) + + Reservation.objects.create( + place=place, + guest=guest, + start=start, + end=end, + price=price + ) if __name__ == '__main__': - synchronize_calendars(sys.argv) + synchronize_calendars() diff --git a/requirements.txt b/requirements.txt index 85614d4..f6f7ede 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,36 @@ asgiref==3.2.3 +astroid==2.3.3 +autopep8==1.4.4 +cachetools==3.1.1 +certifi==2019.11.28 +chardet==3.0.4 dj-database-url==0.5.0 Django==3.0 google-api-python-client==1.7.11 +google-auth==1.7.2 +google-auth-httplib2==0.0.3 +google-auth-oauthlib==0.4.1 +httplib2==0.14.0 +idna==2.8 +isort==4.3.21 +lazy-object-proxy==1.4.3 +mccabe==0.6.1 +oauth2client==4.1.3 +oauthlib==3.1.0 Pillow==6.2.1 psycopg2==2.8.4 +pyasn1==0.4.8 +pyasn1-modules==0.2.7 +pycodestyle==2.5.0 +pylint==2.4.4 pytz==2019.3 +requests==2.22.0 +requests-oauthlib==1.3.0 +rsa==4.0 +six==1.13.0 sqlparse==0.3.0 +typed-ast==1.4.0 +uritemplate==3.0.0 +urllib3==1.25.7 whitenoise==4.1.4 +wrapt==1.11.2 \ No newline at end of file