mirror of
https://github.com/Faridik/Carolyn.git
synced 2026-07-08 13:21:53 +00:00
100 lines
2.7 KiB
Python
100 lines
2.7 KiB
Python
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)
|
||
|
||
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:
|
||
return flask.jsonify(dict(error=True, message=app.db_error)), 500
|
||
result = func(*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(
|
||
score=student.score,
|
||
grade=student.grade,
|
||
assignments=student.assignments,
|
||
)
|
||
)
|
||
|
||
|
||
@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(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")
|