2021-09-03 22:52:16 +03:00

144 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from functools import wraps
from werkzeug.exceptions import *
from manager import *
import flask
import logging
import models
import time
logging.basicConfig()
LOG = logging.getLogger(__name__)
LOG.setLevel(logging.DEBUG)
SUPER_USER = (420, 228)
app = flask.Flask(__name__)
app.db = None
try:
app.db = Manager()
except Exception as e:
app.db_error = e.args
LOG.exception("Cannot init manager")
def availability(func):
"""Декоратор, который проверяет доступность менеджера по работе с Google
Spreadsheets.
Если инициализация менеджера обвалилась, то сервер выдает ошибку 500 и ее
содержимое в JSON."""
@wraps(func)
def wrapper(*args, **kwargs):
if app.db is None:
raise Exception("cannot init manager")
result = func(*args, **kwargs)
return result
return wrapper
def superuser(func):
@wraps(func)
def wrapper(*args, **kwargs):
tg_id = flask.request.args.get("tg_id", -1)
student: Student = app.db.get_student_by_tg_id(tg_id)
if student.number not in SUPER_USER:
raise Forbidden(f"Доступ запрещен для студента {student.name}")
result = func(student, *args, **kwargs)
return result
return wrapper
@app.route("/")
def hello_world():
return "Hello world!\n"
@app.route("/auth")
@availability
def auth():
token = flask.request.args.get("token", None)
tg_id = flask.request.args.get("tg_id", None)
if token is None or tg_id is None:
raise BadRequest("Не предоставлены token и tg_id!")
student = app.db.auth_by_token(token, tg_id)
return flask.jsonify(dict(student=student))
@app.route("/grades")
@availability
def grades():
"""Возвращает оценки по id пользователя из телеграма."""
tg_id = flask.request.args.get("tg_id")
student = app.db.get_student_by_tg_id(tg_id)
app.db.set_assignments_for_student(student)
return flask.jsonify(
dict(
subjects=student.subjects,
assignments=student.assignments,
)
)
@app.route("/broadcast")
@availability
@superuser
def broadcast(student):
"""Выполняет рассылку студентам."""
return flask.jsonify(app.db.get_all_groups_only_sub_students())
@app.route("/sub")
@availability
def sub():
tg_id = flask.request.args.get("tg_id", None)
is_subbed = app.db.sub_by_tg_id(tg_id)
return flask.jsonify(dict(is_subbed=is_subbed))
@app.route("/unsub")
@availability
def unsub():
tg_id = flask.request.args.get("tg_id", None)
is_unsubbed = app.db.unsub_by_tg_id(tg_id)
return flask.jsonify(dict(is_unsubbed=is_unsubbed))
@app.errorhandler(StudentAlreadyAuthed)
def show_error(err):
return flask.jsonify({"error": type(err).__name__, "message": err.message}), 409
@app.errorhandler(AnotherStudentAlreadyAuthed)
def show_error(err):
return flask.jsonify({"error": type(err).__name__, "message": err.message}), 403
@app.errorhandler(StudentNotFound)
def show_error(err):
return flask.jsonify({"error": type(err).__name__, "message": err.message}), 404
@app.errorhandler(StudentAlreadySubbed)
def show_error(err):
return flask.jsonify({"error": type(err).__name__, "message": err.message}), 405
@app.errorhandler(StudentAlreadyUnsubbed)
def show_error(err):
return flask.jsonify({"error": type(err).__name__, "message": err.message}), 406
@app.errorhandler(BadRequest)
def show_error(err):
return flask.jsonify({"error": type(err).__name__, "message": err.description}), 400
# Любая другая ошибка вылетит вот здесь
@app.errorhandler(Exception)
def show_error(err):
return flask.jsonify({"error": type(err).__name__, "message": str(err)}), 500
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0")