computer-science-club

computer-science-club
git clone https://git.prime8.dev/computer-science-club.git
Log | Files | Refs | README | LICENSE

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)