raphael
a071193959
- using flask-wtf forms to create login and registration - saves and compares input data with database - generates user if need-be - same user form as google user
157 lines
4.5 KiB
Python
157 lines
4.5 KiB
Python
# Python standard libraries
|
|
import json
|
|
import os
|
|
import sqlite3
|
|
|
|
# Third-party libraries
|
|
import flask
|
|
from flask import render_template, flash
|
|
from flask import Flask, redirect, request, url_for
|
|
from flask_login import (
|
|
LoginManager,
|
|
current_user,
|
|
login_required,
|
|
login_user,
|
|
logout_user,
|
|
)
|
|
import requests
|
|
|
|
import server.googleHandler as google
|
|
|
|
from server import login_manager, app, db
|
|
from server.forms import LoginForm, RegistrationForm
|
|
from server.models import User, Calendar
|
|
|
|
@app.route("/")
|
|
def account():
|
|
return flask.redirect('account')
|
|
|
|
@app.route("/account")
|
|
def index():
|
|
if current_user.is_authenticated:
|
|
google.updateCalendars()
|
|
return (flask.render_template('account.html',
|
|
username = current_user.username, email = current_user.email, profile_img=current_user.profile_pic
|
|
)
|
|
)
|
|
else:
|
|
return flask.render_template('login.html')
|
|
|
|
@app.route("/calendar")
|
|
@login_required
|
|
def calendar():
|
|
calendars = google.calendarsFromDb()
|
|
return flask.render_template('calendar.html', calendars=calendars)
|
|
|
|
@app.route('/login/email', methods=['GET', 'POST'])
|
|
def emaillogin():
|
|
if current_user.is_authenticated:
|
|
return redirect(url_for('account') )
|
|
form = LoginForm()
|
|
|
|
if form.validate_on_submit():
|
|
user = User.query.filter_by(username=form.username.data).first()
|
|
if user is None or not user.checkPassword(form.password.data):
|
|
flash('invalid username or password')
|
|
return redirect(url_for('emaillogin'))
|
|
login_user(user, remember=form.remember_me.data)
|
|
return redirect(url_for('account'))
|
|
return render_template('emaillogin.html', title='Sign In', form=form)
|
|
|
|
@app.route('/register', methods=['GET', 'POST'])
|
|
def register():
|
|
if current_user.is_authenticated:
|
|
return redirect(url_for('account'))
|
|
form = RegistrationForm()
|
|
if form.validate_on_submit():
|
|
user = User(id=form.username.data,
|
|
username=form.username.data,
|
|
email=form.email.data)
|
|
user.setPassword(form.password.data)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
flash('Congratulations, you are now a registered user!')
|
|
return redirect(url_for('emaillogin'))
|
|
return render_template('register.html', title='Register', form=form)
|
|
|
|
@app.route("/login/google")
|
|
def googlelogin():
|
|
authorization_url = google.login()
|
|
|
|
return flask.redirect(authorization_url)
|
|
|
|
@app.route("/login/google/callback")
|
|
def callback():
|
|
session = google.verifyResponse()
|
|
|
|
userinfo = session.get('https://www.googleapis.com/userinfo/v2/me').json()
|
|
|
|
# Create a user in your db with the information provided
|
|
# by Google
|
|
|
|
# Doesn't exist? Add it to the database.
|
|
if not User.query.get(userinfo['id']):
|
|
newser = User(
|
|
id=userinfo['id'],
|
|
username=userinfo['name'],
|
|
email=userinfo['email'],
|
|
profile_pic=userinfo['picture'],
|
|
password_hash=""
|
|
)
|
|
db.session.add(newser)
|
|
db.session.commit()
|
|
|
|
user = User.query.get(userinfo['id'])
|
|
|
|
# Begin user session by logging the user in
|
|
print("login:" + user.id)
|
|
|
|
login_user(user)
|
|
|
|
return flask.redirect(flask.url_for('index'))
|
|
|
|
@app.route("/logout")
|
|
@login_required
|
|
def logout():
|
|
logout_user()
|
|
return redirect(url_for("index"))
|
|
|
|
def credentials_to_dict(credentials):
|
|
return {'token': credentials.token,
|
|
'refresh_token': credentials.refresh_token,
|
|
'token_uri': credentials.token_uri,
|
|
'client_id': credentials.client_id,
|
|
'client_secret': credentials.client_secret,
|
|
'scopes': credentials.scopes}
|
|
|
|
|
|
@app.route("/userinfo/<path:user>/calendarevents.json")
|
|
def downloader(user):
|
|
print(user)
|
|
path = "/home/raphael/dev/website_ws/website/userinfo/" + user
|
|
return flask.send_from_directory(path, "calendarevents.json")
|
|
|
|
# POST
|
|
|
|
@app.route('/calendar', methods = ['POST', 'DELETE'])
|
|
@login_required
|
|
def user():
|
|
if request.method == 'POST':
|
|
calName = request.json.get('calendar_id')
|
|
color = request.json.get('color')
|
|
toggle = request.json.get('toggle')
|
|
|
|
if color != None:
|
|
Calendar.updateCalendar(current_user.id, calName, color=color)
|
|
if toggle != None:
|
|
Calendar.updateCalendar(current_user.id, calName, toggle=toggle)
|
|
# toggle specific calendar of user
|
|
elif request.method == 'DELETE':
|
|
# do nothing
|
|
return 'NONE'
|
|
else:
|
|
# POST Error 405
|
|
print("405")
|
|
|
|
return 'OK'
|