Compare commits

..

No commits in common. "26006c698f9191b45a3f53de6680a7aee364af31" and "dcf3a571d52ce21140e2294dc7f19a2972f881df" have entirely different histories.

2 changed files with 26 additions and 60 deletions

View File

@ -1,6 +1,6 @@
import bisect import bisect
from datetime import datetime, timedelta from datetime import datetime, timedelta
from flask import Flask, jsonify, make_response, redirect, request from flask import Flask, jsonify, redirect, request
from google.auth.transport.requests import Request from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build from googleapiclient.discovery import build
@ -14,8 +14,7 @@ WEEK_DAYS = {1, 2, 3, 4, 5}
FROM = 9 FROM = 9
TO = 17 TO = 17
TIMEZONE_NAME = 'America/New_York' TIMEZONE = pytz.timezone('America/New_York')
TIMEZONE = pytz.timezone(TIMEZONE_NAME)
AVAILABILITY_LIFETIME = timedelta(minutes=2) AVAILABILITY_LIFETIME = timedelta(minutes=2)
@ -32,12 +31,8 @@ def read_datetime(dct):
return dt return dt
def asiso(dt):
return dt.isoformat()[:19]
def asutciso(dt): def asutciso(dt):
return asiso(dt.astimezone(UTC)) + 'Z' return dt.astimezone(UTC).isoformat()[:19] + 'Z'
def aslocal(dt): def aslocal(dt):
@ -116,49 +111,6 @@ def api_availability():
return jsonify({'availability': [asutciso(time) for time in availability]}) return jsonify({'availability': [asutciso(time) for time in availability]})
@app.route('/book', methods=['POST', 'OPTIONS']) @app.route('/book', methods=['POST'])
def api_book(): def api_book():
# Allow cross-origin TODO
if request.method == 'OPTIONS':
response = make_response()
response.headers.add(
'Access-Control-Allow-Origin',
'https://vicky.rampin.org',
)
response.headers.add(
'Access-Control-Allow-Headers',
'Content-Type',
)
response.headers.add(
'Access-Control-Allow-Methods',
'POST',
)
return response
if not creds.valid:
creds.refresh(Request())
service = build('calendar', 'v3', credentials=creds)
full_name = request.form['name']
email = request.form['email']
topic = request.form['topic']
date = request.form['date']
end = start + timedelta(minutes=30)
service.events().insert(
calendarId='primary',
body=dict(
start={'dateTime': asiso(start), 'timeZone': TIMEZONE_NAME},
end={'dateTime': asiso(end), 'timeZone': TIMEZONE_NAME},
summary="Meeting with Vicky",
description="Meeting scheduled from the web",
),
)
response = redirect('https://vicky.rampin.org/book-successful', 303)
response.headers.add(
'Access-Control-Allow-Origin',
'https://vicky.rampin.org',
)
return response

View File

@ -7,34 +7,48 @@
<body> <body>
<div class="container px-5 my-5"> <div class="container px-5 my-5">
<form id="contactForm"> <form id="contactForm" data-sb-form-api-token="API_TOKEN">
<div class="mb-3"> <div class="mb-3">
<label class="form-label" for="name">Full name</label> <label class="form-label" for="name">Full name</label>
<input class="form-control" id="name" name="name" type="text" placeholder="Full name" /> <input class="form-control" id="name" name="name" type="text" placeholder="Full name" data-sb-validations="required" />
<div class="invalid-feedback" data-sb-feedback="fullName:required">Full name is required.</div>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label" for="email">Email address</label> <label class="form-label" for="email">Email address</label>
<input class="form-control" id="email" name="email" type="email" placeholder="Email address" /> <input class="form-control" id="email" name="email" type="email" placeholder="Email address" data-sb-validations="required,email" />
<div class="invalid-feedback" data-sb-feedback="emailAddress:required">Email address is required.</div>
<div class="invalid-feedback" data-sb-feedback="emailAddress:email">Email address Email is not valid.</div>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label" for="topic">What would you like to discuss?</label> <label class="form-label" for="topic">What would you like to discuss?</label>
<textarea class="form-control" id="topic" name="topic" placeholder="What would you like to discuss?" style="height: 10rem;"></textarea> <textarea class="form-control" id="topic" name="topic" placeholder="What would you like to discuss?" style="height: 10rem;" data-sb-validations="required"></textarea>
<div class="invalid-feedback" data-sb-feedback="whatWouldYouLikeToDiscuss:required">What would you like to discuss? is required.</div>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label d-block">Which day and time works best for us to meet on Zoom?</label> <label class="form-label d-block">Which day and time works best for us to meet on Zoom?</label>
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" id="optionA" type="radio" name="date" /> <input class="form-check-input" id="optionA" type="radio" name="date" data-sb-validations="" />
<label class="form-check-label" for="optionA">option A</label> <label class="form-check-label" for="optionA">option A</label>
</div> </div>
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" id="optionB" type="radio" name="date" /> <input class="form-check-input" id="optionB" type="radio" name="date" data-sb-validations="" />
<label class="form-check-label" for="optionB">option B</label> <label class="form-check-label" for="optionB">option B</label>
</div> </div>
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" id="optionC" type="radio" name="date" /> <input class="form-check-input" id="optionC" type="radio" name="date" data-sb-validations="" />
<label class="form-check-label" for="optionC">option C</label> <label class="form-check-label" for="optionC">option C</label>
</div> </div>
</div> </div>
<div class="d-none" id="submitSuccessMessage">
<div class="text-center mb-3">
<div class="fw-bolder">Form submission successful!</div>
<p>To activate this form, sign up at</p>
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<div class="d-none" id="submitErrorMessage">
<div class="text-center text-danger mb-3">Error sending message!</div>
</div>
<div class="d-grid"> <div class="d-grid">
<button class="btn btn-primary btn-lg disabled" id="submitButton" type="submit">Submit</button> <button class="btn btn-primary btn-lg disabled" id="submitButton" type="submit">Submit</button>
</div> </div>