diff --git a/server/app/apis/__init__.py b/server/app/apis/__init__.py index 683b61c02b3d48caf29e38470d878b3a38f62ae7..e76f8bc51f3a3f08b080334db75b17bad7528647 100644 --- a/server/app/apis/__init__.py +++ b/server/app/apis/__init__.py @@ -55,6 +55,9 @@ def item_response(item, code=http_codes.OK): from flask_restx import Api +from .alternatives import api as alternative_ns + +# from .answers import api as answer_ns from .auth import api as auth_ns from .codes import api as code_ns from .competitions import api as comp_ns @@ -73,6 +76,8 @@ flask_api.add_namespace(user_ns, path="/api/users") flask_api.add_namespace(auth_ns, path="/api/auth") flask_api.add_namespace(comp_ns, path="/api/competitions") flask_api.add_namespace(slide_ns, path="/api/competitions/<CID>/slides") +flask_api.add_namespace(alternative_ns, path="/api/competitions/<CID>/slides/<SOrder>/questions/<QID>/alternatives") +# flask_api.add_namespace(answer_ns, path="/api/competitions/<CID>/slides/<SOrder/questions/<QID>/answers") flask_api.add_namespace(team_ns, path="/api/competitions/<CID>/teams") flask_api.add_namespace(code_ns, path="/api/competitions/<CID>/codes") flask_api.add_namespace(question_ns, path="/api/competitions/<CID>") diff --git a/server/app/apis/alternatives.py b/server/app/apis/alternatives.py new file mode 100644 index 0000000000000000000000000000000000000000..db36883c0190c85c35c2549a80f9f1fd93d07547 --- /dev/null +++ b/server/app/apis/alternatives.py @@ -0,0 +1,47 @@ +import app.core.http_codes as codes +import app.database.controller as dbc +from app.apis import check_jwt, item_response, list_response +from app.core.dto import QuestionAlternativeDTO, QuestionDTO +from app.core.parsers import question_alternative_parser +from app.core.schemas import QuestionAlternativeSchema +from app.database.controller.add import question_alternative +from app.database.controller.get import question_alternatives +from app.database.models import Question, QuestionAlternative +from flask_jwt_extended import jwt_required +from flask_restx import Resource + +api = QuestionAlternativeDTO.api +schema = QuestionAlternativeDTO.schema +list_schema = QuestionAlternativeDTO.list_schema + + +@api.route("/") +@api.param("CID, SOrder, QID") +class QuestionAlternativeList(Resource): + @check_jwt(editor=True) + def get(self, CID, SOrder, QID): + items = dbc.get.question_alternatives(QID) + return list_response(list_schema.dump(items)) + + @check_jwt(editor=True) + def post(self, CID, SOrder, QID): + args = question_alternative_parser.parse_args(strict=True) + item = dbc.add.question_alternative(**args, question_id=QID) + return item_response(schema.dump(item)) + + +@api.route("/<AID>") +@api.param("CID, SOrder, QID, AID") +class QuestionAlternativeList(Resource): + @check_jwt(editor=True) + def put(self, CID, SOrder, QID, AID): + args = question_alternative_parser.parse_args(strict=True) + item = dbc.get.one(QuestionAlternative, AID) + item = dbc.edit.question_alternative(item, **args) + return item_response(schema.dump(item)) + + @check_jwt(editor=True) + def delete(self, CID, SOrder, QID, AID): + item = dbc.get.one(QuestionAlternative, AID) + dbc.delete.default(item) + return {}, codes.NO_CONTENT diff --git a/server/app/apis/questions.py b/server/app/apis/questions.py index f486e3493b09070b5da145c48f497ea30792164e..7d16d3c89e660345c510d84dc645f111dbd7fbf4 100644 --- a/server/app/apis/questions.py +++ b/server/app/apis/questions.py @@ -14,7 +14,7 @@ list_schema = QuestionDTO.list_schema @api.route("/questions") @api.param("CID") -class QuestionsList(Resource): +class QuestionList(Resource): @check_jwt(editor=True) def get(self, CID): items = dbc.get.question_list(CID) @@ -23,7 +23,7 @@ class QuestionsList(Resource): @api.route("/slides/<SID>/questions") @api.param("CID, SID") -class QuestionsList(Resource): +class QuestionListForSlide(Resource): @check_jwt(editor=True) def post(self, SID, CID): args = question_parser.parse_args(strict=True) @@ -37,7 +37,7 @@ class QuestionsList(Resource): @api.route("/slides/<SID>/questions/<QID>") @api.param("CID, SID, QID") -class Questions(Resource): +class QuestionById(Resource): @check_jwt(editor=True) def get(self, CID, SID, QID): item_question = dbc.get.question(CID, SID, QID) diff --git a/server/app/core/dto.py b/server/app/core/dto.py index 034826f5fb784bca39bc85c355d767ccc7ab1498..c1e66223d14a27ea460ee67db106478e6ede989e 100644 --- a/server/app/core/dto.py +++ b/server/app/core/dto.py @@ -68,3 +68,15 @@ class QuestionDTO: api = Namespace("questions") schema = schemas.QuestionSchema(many=False) list_schema = schemas.QuestionSchema(many=True) + + +class QuestionAlternativeDTO: + api = Namespace("alternatives") + schema = schemas.QuestionAlternativeSchema(many=False) + list_schema = schemas.QuestionAlternativeSchema(many=True) + + +# class QuestionAnswerDTO: +# api = Namespace("answers") +# schema = schemas.QuestionAnswerSchema(many=False) +# list_schema = schemas.QuestionAnswerSchema(many=True) diff --git a/server/app/core/parsers.py b/server/app/core/parsers.py index f5536cf2f1f0f5e0a751bb70257b9f6f35278d4e..5a91755862b858a4eaf44e0c6ee825d8b528451f 100644 --- a/server/app/core/parsers.py +++ b/server/app/core/parsers.py @@ -60,7 +60,14 @@ question_parser.add_argument("total_score", type=int, default=None, location="js question_parser.add_argument("type_id", type=int, default=None, location="json") question_parser.add_argument("slide_id", type=int, location="json") -###QUESTION#### + +###QUESTION ALTERNATIVES#### +question_alternative_parser = reqparse.RequestParser() +question_alternative_parser.add_argument("text", type=str, default=None, location="json") +question_alternative_parser.add_argument("value", type=int, default=None, location="json") + + +###CODE#### code_parser = reqparse.RequestParser() code_parser.add_argument("pointer", type=str, default=None, location="json") code_parser.add_argument("view_type_id", type=int, default=None, location="json") diff --git a/server/app/core/rich_schemas.py b/server/app/core/rich_schemas.py index a890489e23a30aef19c41b1cfc105d9954c68d37..8852c392c4a060a065f618a66393e55b8a2627a8 100644 --- a/server/app/core/rich_schemas.py +++ b/server/app/core/rich_schemas.py @@ -20,7 +20,7 @@ class QuestionSchemaRich(RichSchema): total_score = ma.auto_field() slide_id = ma.auto_field() type_id = ma.auto_field() - alternatives = fields.Nested(schemas.QuestionAlternative, many=True) + alternatives = fields.Nested(schemas.QuestionAlternativeSchema, many=True) class TeamSchemaRich(RichSchema): diff --git a/server/app/core/schemas.py b/server/app/core/schemas.py index ff561491ac12644abda6e004efbec12a54becb77..70bb2e2cf4ba211bee366115b9e1a4bca80b8aa9 100644 --- a/server/app/core/schemas.py +++ b/server/app/core/schemas.py @@ -68,7 +68,7 @@ class QuestionAnswerSchema(BaseSchema): team_id = ma.auto_field() -class QuestionAlternative(BaseSchema): +class QuestionAlternativeSchema(BaseSchema): class Meta(BaseSchema.Meta): model = models.QuestionAlternative diff --git a/server/app/database/controller/add.py b/server/app/database/controller/add.py index de0135f2f514745017b85f654f4afc3203b69975..45a13d71fed88374c9c20b4cade24652e7430bc7 100644 --- a/server/app/database/controller/add.py +++ b/server/app/database/controller/add.py @@ -15,6 +15,7 @@ from app.database.models import ( Media, MediaType, Question, + QuestionAlternative, QuestionType, Role, Slide, @@ -114,6 +115,10 @@ def question(name, total_score, type_id, item_slide): return db_add(Question(name, total_score, type_id, item_slide.id)) +def question_alternative(text, value, question_id): + return db_add(QuestionAlternative(text, value, question_id)) + + def code(pointer, view_type_id): """ Adds a code to the database using the provided arguments. """ diff --git a/server/app/database/controller/edit.py b/server/app/database/controller/edit.py index 52471badd4edc43ff503436f4f9dbbb65a580c6c..aa75b67bd4ce470b702c4ad8b15afcaa6727f918 100644 --- a/server/app/database/controller/edit.py +++ b/server/app/database/controller/edit.py @@ -125,3 +125,17 @@ def question(item_question, name=None, total_score=None, type_id=None, slide_id= db.session.refresh(item_question) return item_question + + +def question_alternative(item, text=None, value=None): + + if text: + item.text = text + + if value: + item.value = value + + db.session.commit() + db.session.refresh(item) + + return item diff --git a/server/app/database/controller/get.py b/server/app/database/controller/get.py index f7d14914957066b6ac90bad09b16745bc9a59262..efe30d12e1a24c25178d0e3822a7cd02fccdacb2 100644 --- a/server/app/database/controller/get.py +++ b/server/app/database/controller/get.py @@ -12,6 +12,7 @@ from app.database.models import ( ComponentType, MediaType, Question, + QuestionAlternative, QuestionType, Role, Slide, @@ -78,6 +79,11 @@ def question(CID, SOrder, QID, required=True, error_msg=None): return Question.query.join(Slide, join_filters).filter(Question.id == QID).first_extended(required, error_msg) +def question_alternatives(QID): + # join_filters = (Slide.competition_id == CID) & (Slide.order == SOrder) + return QuestionAlternative.query.filter(QuestionAlternative.question_id == QID).all() + + def competition(CID): """ Get Competition and all it's sub-entities """ """ HOT PATH """ diff --git a/server/app/database/models.py b/server/app/database/models.py index da9e0620b55bf20c6b2ab11bbc4b3ea4a80fe661..2c16fdac26611805a20f6c9dfc72aad97dc48c68 100644 --- a/server/app/database/models.py +++ b/server/app/database/models.py @@ -160,7 +160,7 @@ class Question(db.Model): class QuestionAlternative(db.Model): id = db.Column(db.Integer, primary_key=True) text = db.Column(db.String(STRING_SIZE), nullable=False) - value = db.Column(db.Boolean, nullable=False) + value = db.Column(db.Integer, nullable=False) question_id = db.Column(db.Integer, db.ForeignKey("question.id"), nullable=False) def __init__(self, text, value, question_id):