main.py (3736B)
1 import os, sys, pathlib 2 3 PROJECT_DIR = os.path.join(pathlib.Path(__file__).parent) 4 sys.path.append(os.path.join(PROJECT_DIR, "config.py")) 5 sys.path.append(os.path.join(PROJECT_DIR, "models")) 6 sys.path.append(os.path.join(PROJECT_DIR, "projects.py")) 7 sys.path.append(os.path.join(PROJECT_DIR, "schoology.py")) 8 from config import DOMAIN 9 from models import Group, Project 10 from database import database 11 from schoology import group 12 from flask import Flask, request, redirect, abort, render_template, session 13 from cachecontrol import CacheControl 14 15 import secrets 16 17 app = Flask(__name__) 18 app.secret_key = os.environ.get("SECRET_KEY", secrets.token_hex(32)) 19 20 21 @app.route("/") 22 def index(): 23 return render_template("home.html", group=group, account=session.get("name")) 24 25 26 @app.route("/updates") 27 def updates(): 28 return render_template("updates.html", group=group, account=session.get("name")) 29 30 31 @app.route("/discussions") 32 def discussions(): 33 return render_template("discussions.html", group=group, account=session.get("name")) 34 35 36 @app.route("/projects", methods=["GET", "POST"]) 37 def projects(): 38 return render_template( 39 "projects.html", group=group, create=False, account=session.get("name") 40 ) 41 42 43 @app.route("/projects/add", methods=["GET", "POST"]) 44 def add_project(): 45 if request.method == "POST": 46 if not session.get("name"): 47 return abort(401) 48 name = request.form["name"].rstrip() 49 description = request.form["description"].rstrip() 50 if description == "": 51 description = None 52 authors = [a.strip() for a in request.form["authors"].split(",") if a.strip()] 53 source = request.form["source"].rstrip() 54 if source == "": 55 source = None 56 project = Project(name, description, authors, source) 57 database.add(project) 58 return redirect("/projects") 59 return render_template( 60 "projects.html", group=group, create=True, account=session.get("name") 61 ) 62 63 64 @app.route("/members") 65 def members(): 66 return render_template("members.html", group=group, account=session.get("name")) 67 68 69 import requests 70 import google.auth.transport.requests 71 from google_auth_oauthlib.flow import Flow 72 from google.oauth2 import id_token 73 74 GOOGLE_CLIENT_ID = ( 75 "861597772911-7k5ipk33tj84ubts3oulmqt6jp053hnr.apps.googleusercontent.com" 76 ) 77 GOOGLE_CLIENT_SECRETS_FILE = os.path.join(PROJECT_DIR, "google_auth.json") 78 GOOGLE_AUTH_SCOPES = [ 79 "https://www.googleapis.com/auth/userinfo.profile", 80 "https://www.googleapis.com/auth/userinfo.email", 81 "openid", 82 ] 83 if os.environ.get("FLASK_ENV") == "development": 84 os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" 85 86 flow = Flow.from_client_secrets_file( 87 client_secrets_file=GOOGLE_CLIENT_SECRETS_FILE, 88 scopes=GOOGLE_AUTH_SCOPES, 89 redirect_uri=DOMAIN + "/login/callback", 90 ) 91 92 93 @app.route("/login") 94 def login(): 95 auth_url, state = flow.authorization_url() 96 session["state"] = state 97 return redirect(auth_url) 98 99 100 @app.route("/login/callback") 101 def login_callback(): 102 flow.fetch_token(authorization_response=request.url) 103 if not session["state"] == request.args["state"]: 104 abort(500) 105 credentials = flow.credentials 106 request_session = requests.session() 107 cached_session = CacheControl(request_session) 108 token_request = google.auth.transport.requests.Request(session=cached_session) 109 id_info = id_token.verify_oauth2_token( 110 id_token=credentials._id_token, 111 request=token_request, 112 audience=GOOGLE_CLIENT_ID, 113 ) 114 session["name"] = id_info.get("name") 115 return redirect("/") 116 117 118 @app.route("/logout") 119 def logout(): 120 session.clear() 121 return redirect("/") 122 123 124 if __name__ == "__main__": 125 app.run(host="0.0.0.0", port=80)