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 0000000..2fa8d7c Binary files /dev/null and b/static/logo/google.png differ 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 +
+
+
+
+
+ + + + + +