From b409f20d41a4eb9065b2c2661bc561bcd568c32b Mon Sep 17 00:00:00 2001 From: Valentin <43043885+itsmrval@users.noreply.github.com> Date: Fri, 17 Nov 2023 09:25:14 +0100 Subject: [PATCH] index demo page --- app.py | 140 +++++++++++++++++++++++++++++++++++++++-- static/logo/google.png | Bin 0 -> 28751 bytes templates/index.html | 26 ++++++++ templates/login.html | 30 +++++++++ 4 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 static/logo/google.png create mode 100644 templates/index.html create mode 100644 templates/login.html diff --git a/app.py b/app.py index 6c75781..e7302e1 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,8 @@ -from flask import Flask, redirect, url_for, session +from flask import Flask, redirect, url_for, session, render_template, Response from flask_oauthlib.client import OAuth from flask_sqlalchemy import SQLAlchemy +from datetime import datetime +from icalendar import Calendar, Event import os from dotenv import load_dotenv load_dotenv() @@ -28,6 +30,39 @@ google = oauth.remote_app( authorize_url='https://accounts.google.com/o/oauth2/auth', ) +teams_dict = { + 1: "Lakers", + 2: "Heat", + 3: "Warriors", + 4: "Celtics", + 5: "Spurs", + 6: "Knicks", + 7: "Pistons", + 8: "Magic", + 9: "Suns", + 10: "Pacers", + 11: "Jazz", + 12: "Trail Blazers", + 13: "Raptors", + 14: "Mavericks", + 15: "Bucks", + 16: "Thunder", + 17: "Bulls", + 18: "Pelicans", + 19: "Rockets", + 20: "Kings", + 21: "Clippers", + 22: "Cavaliers", + 23: "Hawks", + 24: "Grizzlies", + 25: "Nuggets", + 26: "Hornets", + 27: "76ers", + 28: "Wizards", + 29: "Timberwolves", + 30: "Nets" +} + class User(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True) @@ -42,16 +77,67 @@ def addTeam(idUser, idTeam): db.session.add(team) db.session.commit() -def getTeamName(idTeam): +def deleteTeam(idTeam): + team = Team.query.filter_by(idTeam=idTeam).first() + db.session.delete(team) + db.session.commit() +def getTeamName(idTeam): + return teams_dict[idTeam] def getTeams(idUser): teams = Team.query.filter_by(idUser=idUser).all() return teams +def assignTeam(idUser, idTeam): + team = Team.query.filter_by(idTeam=idTeam).first() + if team is None: + addTeam(idUser, idTeam) + else: + team.idUser = idUser + db.session.commit() + +def createEvent(summary, start_time, end_time): + event = Event() + event.add('summary', summary) + event.add('dtstart', start_time) + event.add('dtend', end_time) + return event + +def generateIcal(events): + cal = Calendar() + for event_data in events: + event = createEvent( + event_data['summary'], + event_data['start_time'], + event_data['end_time'] + ) + cal.add_component(event) + return cal.to_ical() @app.route('/') def index(): + if 'google_token' in session: + me = google.get('userinfo') + if (not(me.data['email'])): + return redirect("/logout", code=302) + user = User.query.filter_by(email=me.data['email']).first() + if user is None: + user = User(email=me.data['email']) + db.session.add(user) + db.session.commit() + + otherTeams = [] + + for i in list(teams_dict.keys()): + if (Team.query.filter_by(idUser=user.id, idTeam=i).first()): + otherTeams.insert(i) + + return render_template('index.html', userTeams=getTeams(user.id), otherTeams=otherTeams, getTeamName=getTeamName) + return redirect("/login", code=302) + +@app.route('/add/') +def addTeam(idTeam): if 'google_token' in session: me = google.get('userinfo') user = User.query.filter_by(email=me.data['email']).first() @@ -59,11 +145,56 @@ def index(): user = User(email=me.data['email']) db.session.add(user) db.session.commit() - return 'Logged in as: ' + me.data['email'] + + assignTeam(user.id, idTeam) + return redirect("/", code=302) + return redirect("/login", code=302) + +@app.route('/delete/') +def deleteTeam(idTeam): + if 'google_token' in session: + me = google.get('userinfo') + user = User.query.filter_by(email=me.data['email']).first() + if user is None: + user = User(email=me.data['email']) + db.session.add(user) + db.session.commit() + + deleteTeam(idTeam) + return redirect("/", code=302) + return redirect("/login", code=302) + +@app.route('/calendar') +def download_ical(): + if 'google_token' in session: + me = google.get('userinfo') + user = User.query.filter_by(email=me.data['email']).first() + if user is None: + user = User(email=me.data['email']) + db.session.add(user) + db.session.commit() + + user_teams = getTeams(user.id) + + events_data = [] + for team in user_teams: + team_events = parseTeamEvents(team.events) + events_data.extend(team_events) + + ical_data = generateIcal(events_data) + + response = Response(ical_data, content_type='text/calendar') + response.headers['Content-Disposition'] = 'inline; filename=calendar.ics' + return response + return redirect("/login", code=302) @app.route('/login') def login(): + return render_template('login.html') + +@app.route('/login/google') +def google_redirect(): return google.authorize(callback=url_for('authorized', _external=True)) @app.route('/logout') @@ -89,4 +220,5 @@ def get_google_oauth_token(): if __name__ == '__main__': with app.app_context(): db.create_all() - app.run(debug=True) \ No newline at end of file + + app.run(debug=True, port=5050) \ No newline at end of file diff --git a/static/logo/google.png b/static/logo/google.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa8d7c21ea1563513ddb53e866022bf8906e7ae GIT binary patch literal 28751 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 B&{Y5c literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..ed1bd12 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,26 @@ + + + + + + Calendar settings + + + +

Your Teams:

+ + +

Total Teams:

+ + +Download iCal Calendar + + diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..325dad6 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,30 @@ + + + + + + + Login with Google + + + +
+
+
+
+
+ +
Login with Google
+

Click the button below to connect with Google

+ Login with Google +
+
+
+
+
+ + + + + +