From 04bcb98ae6c53acddc4c9cea8c12fe15fc269e80 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Victor=20L=C3=B6fgren?= <viclo211@student.liu.se>
Date: Sat, 22 May 2021 00:22:10 +0200
Subject: [PATCH] Add answer api

---
 server/app/apis/__init__.py |  4 +--
 server/app/apis/answers.py  | 64 ++++++++++++++++++-------------------
 2 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/server/app/apis/__init__.py b/server/app/apis/__init__.py
index 0ab7ce7d..945d9d7d 100644
--- a/server/app/apis/__init__.py
+++ b/server/app/apis/__init__.py
@@ -115,8 +115,6 @@ def protect_route(allowed_roles=None, allowed_views=None):
 
 # flask_api = Api()
 
-# flask_api.add_namespace(answer_ns, path="/api/competitions/<competition_id>/teams/<team_id>/answers")
-
 # flask_api.add_namespace(score_ns, path="/api/competitions/<competition_id>/teams/<team_id>/answers/question_scores")
 
 from flask_smorest import Api
@@ -127,6 +125,7 @@ flask_api = Api()
 def init_api():
 
     from .alternatives import blp as alternative_blp
+    from .answers import blp as answer_blp
     from .auth import blp as auth_blp
     from .codes import blp as code_blp
     from .competitions import blp as competition_blp
@@ -149,3 +148,4 @@ def init_api():
     flask_api.register_blueprint(code_blp)
     flask_api.register_blueprint(alternative_blp)
     flask_api.register_blueprint(component_blp)
+    flask_api.register_blueprint(answer_blp)
diff --git a/server/app/apis/answers.py b/server/app/apis/answers.py
index 190f7491..2bcbf159 100644
--- a/server/app/apis/answers.py
+++ b/server/app/apis/answers.py
@@ -4,57 +4,57 @@ Default route: /api/competitions/<competition_id>/teams/<team_id>/answers
 """
 
 import app.database.controller as dbc
-from app.apis import item_response, list_response, protect_route
-from app.core.dto import QuestionAlternativeAnswerDTO, QuestionScoreDTO
-from app.core.parsers import sentinel
-from flask_restx import Resource, reqparse
+from app.apis import protect_route
+from app.core import ma
+from app.core.schemas import BaseSchema, QuestionAlternativeAnswerSchema
+from app.database import models
+from flask.views import MethodView
+from flask_smorest import Blueprint, abort, response
 
-api = QuestionAlternativeAnswerDTO.api
-schema = QuestionAlternativeAnswerDTO.schema
-list_schema = QuestionAlternativeAnswerDTO.list_schema
+from . import http_codes
 
-score_schema = QuestionScoreDTO.schema
-score_list_schema = QuestionScoreDTO.list_schema
+blp = Blueprint(
+    "answer",
+    "answer",
+    url_prefix="/api/competitions/<competition_id>/teams/<team_id>/answers",
+    description="Adding, updating, deleting and copy answer",
+)
 
 
-answer_parser_add = reqparse.RequestParser()
-answer_parser_add.add_argument("answer", type=str, required=True, location="json")
+class AnswerAddArgsSchema(BaseSchema):
+    class Meta(BaseSchema.Meta):
+        model = models.QuestionAlternativeAnswer
 
-answer_parser_edit = reqparse.RequestParser()
-answer_parser_edit.add_argument("answer", type=str, default=sentinel, location="json")
+    answer = ma.auto_field(required=False)
 
 
-@api.route("/question_alternatives")
-@api.param("competition_id, team_id")
-class QuestionAlternativeList(Resource):
+@blp.route("")
+class QuestionAlternativeList(MethodView):
     @protect_route(allowed_roles=["*"], allowed_views=["*"])
+    @blp.response(http_codes.OK, QuestionAlternativeAnswerSchema)
     def get(self, competition_id, team_id):
         """ Gets all question answers that the specified team has given. """
+        return dbc.get.question_alternative_answer_list(competition_id, team_id)
 
-        items = dbc.get.question_alternative_answer_list(competition_id, team_id)
-        return list_response(list_schema.dump(items))
 
-
-@api.route("/question_alternatives/<question_alternative_id>")
-@api.param("competition_id, team_id, question_alternative_id")
-class QuestionAlternativeAnswers(Resource):
+@blp.route("/<answer_id>")
+class QuestionAlternativeAnswers(MethodView):
     @protect_route(allowed_roles=["*"], allowed_views=["*"])
-    def get(self, competition_id, team_id, question_alternative_id):
+    @blp.response(http_codes.OK, QuestionAlternativeAnswerSchema)
+    def get(self, competition_id, team_id, answer_id):
         """ Gets the specified question answer. """
-
-        item = dbc.get.question_alternative_answer(competition_id, team_id, question_alternative_id)
-        return item_response(schema.dump(item))
+        return dbc.get.question_alternative_answer(competition_id, team_id, answer_id)
 
     @protect_route(allowed_roles=["*"], allowed_views=["*"])
-    def put(self, competition_id, team_id, question_alternative_id):
+    @blp.arguments(AnswerAddArgsSchema)
+    @blp.response(http_codes.OK, QuestionAlternativeAnswerSchema)
+    def put(self, args, competition_id, team_id, answer_id):
         """ Add or edit specified quesiton_answer. """
 
-        item = dbc.get.question_alternative_answer(competition_id, team_id, question_alternative_id, required=False)
+        item = dbc.get.question_alternative_answer(competition_id, team_id, answer_id, required=False)
         if item is None:
-            args = answer_parser_add.parse_args(strict=True)
-            item = dbc.add.question_alternative_answer(args.get("answer"), question_alternative_id, team_id)
+            item = dbc.add.question_alternative_answer(args.get("answer"), answer_id, team_id)
         else:
-            args = answer_parser_edit.parse_args(strict=True)
             item = dbc.edit.default(item, **args)
 
-        return item_response(schema.dump(item))
+        return item
-- 
GitLab