SAE-A2-TruthInquiry/truthinquiry/routes/routes_admin.py
2023-04-01 17:48:24 +02:00

107 lines
3.6 KiB
Python

import flask
from sqlalchemy import select, or_
from truthinquiry.ext.database.models import *
from truthinquiry.ext.database.fsa import db
from truthinquiry.utils import require_admin
routes_admin = flask.Blueprint("admin", __name__)
DEFAULT_LANG = "FR"
@routes_admin.route("/")
@require_admin(ui=True)
def index():
npcs_objs = db.session.query(Npc).all()
npcs_dicts = [{"id": npc_obj.NPC_ID, "name": npc_obj.NAME_LOCALE.get_text(DEFAULT_LANG).TEXT} for npc_obj in npcs_objs]
return flask.render_template("admin/index.html", npcs=npcs_dicts)
@routes_admin.route("/auth")
def auth():
input_failed = bool(flask.request.values.get("failed"))
return flask.render_template("admin/auth.html", failed=input_failed)
@routes_admin.route("/npc/<npc_id>")
@require_admin(ui=True)
def npc(npc_id):
if npc_id == "new":
return flask.render_template("admin/npc.html", npc={})
else:
npc_obj = db.session.get(Npc, npc_id)
npc_answers = []
for answer_type in npc_obj.ANSWERS:
answer_list = [answer.TEXT for answer in answer_type.TEXT_LOCALE.TEXTS]
npc_answers.append(answer_list)
reactions = [{
"id": reaction.TRAIT.TRAIT_ID,
"name": reaction.TRAIT.NAME_LOCALE.get_text(DEFAULT_LANG).TEXT,
"url": "/api/v1/getReaction?uuid="+reaction.REACTION_UUID
} for reaction in npc_obj.REACTIONS]
reactions_to_add = []
for trait in db.session.query(Trait).all():
if trait.TRAIT_ID not in [reaction.TRAIT.TRAIT_ID for reaction in npc_obj.REACTIONS]:
reactions_to_add.append({
"id": trait.TRAIT_ID,
"name": trait.NAME_LOCALE.get_text(DEFAULT_LANG).TEXT
})
npc_dict = {
"id": npc_obj.NPC_ID,
"name": npc_obj.NAME_LOCALE.get_text(DEFAULT_LANG).TEXT,
"img": npc_obj.NPC_ID,
"answers": npc_answers,
"reactions": reactions,
"reactions_to_add": reactions_to_add,
}
return flask.render_template("admin/npc.html", npc=npc_dict)
@routes_admin.route("/questions")
@require_admin(ui=True)
def questions():
lang = DEFAULT_LANG
results = db.session.execute(
select(QuestionType, Text)
.select_from(QuestionType)
.join(Locale)
.join(Text, isouter=True)
.filter(or_(Text.LANG==None, Text.LANG==lang))
.order_by(QuestionType.QUESTION_TYPE_ID)
)
data = []
old_question_type_id = None
for question_type, locale in results:
if question_type.QUESTION_TYPE_ID != old_question_type_id:
old_question_type_id = question_type.QUESTION_TYPE_ID
data.append({"questions": []})
if locale:
data[-1]["questions"].append({"text": locale.TEXT})
return flask.render_template("admin/questions.html", questions=data, langs=["FR", "EN"])
@routes_admin.route("/places")
@require_admin(ui=True)
def places():
lang = DEFAULT_LANG
places_objs = db.session.query(Place).all()
places_dicts = [{"id": place_obj.PLACE_ID, "name": place_obj.NAME_LOCALE.get_text(lang).TEXT} for place_obj in places_objs]
return flask.render_template("admin/places.html", places=places_dicts)
@routes_admin.route("/traits")
@require_admin(ui=True)
def traits():
lang = DEFAULT_LANG
traits_objs = db.session.query(Trait).all()
traits_dicts = [{"id": trait_obj.TRAIT_ID, "name": trait_obj.NAME_LOCALE.get_text(lang).TEXT, "desc": trait_obj.DESC_LOCALE.get_text(lang).TEXT} for trait_obj in traits_objs]
return flask.render_template("admin/traits.html", traits=traits_dicts)