From b9fc56891cb17aa9c37685fa77668acfc942a885 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Victor=20L=C3=B6fgren?= <victor.l0fgr3n@gmail.com>
Date: Thu, 8 Apr 2021 17:14:08 +0200
Subject: [PATCH] Add team edit api

---
 server/app/apis/questions.py       |  2 +-
 server/app/apis/teams.py           | 30 ++++++++++++++++++++++--------
 server/app/core/controller/edit.py | 11 +++++++++++
 server/app/core/controller/get.py  |  2 +-
 server/app/core/parsers.py         |  5 +++++
 5 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/server/app/apis/questions.py b/server/app/apis/questions.py
index d8e8b701..a82b25ea 100644
--- a/server/app/apis/questions.py
+++ b/server/app/apis/questions.py
@@ -54,7 +54,7 @@ class Questions(Resource):
 
     @jwt_required
     def delete(self, CID, QID):
-        item_question = dbc.get.question(CID, QID).first()
+        item_question = dbc.get.question(CID, QID)
         if not item_question:
             return {"response": "No content found"}, codes.NOT_FOUND
 
diff --git a/server/app/apis/teams.py b/server/app/apis/teams.py
index bec6cb6a..ac2cc06f 100644
--- a/server/app/apis/teams.py
+++ b/server/app/apis/teams.py
@@ -3,6 +3,7 @@ import app.core.http_codes as codes
 from app.apis import admin_required, item_response, list_response
 from app.core.dto import TeamDTO
 from app.core.models import Competition, Team
+from app.core.parsers import team_parser
 from flask_jwt_extended import get_jwt_identity, jwt_required
 from flask_restx import Namespace, Resource, reqparse
 
@@ -25,14 +26,10 @@ class TeamsList(Resource):
 
     @jwt_required
     def post(self, CID):
-        parser = reqparse.RequestParser()
-        parser.add_argument("name", type=str, location="json")
-        args = parser.parse_args(strict=True)
-
+        args = team_parser.parse_args(strict=True)
         item_comp = get_comp(CID)
-        dbc.add.team(args["name"], item_comp)
-        dbc.refresh(item_comp)
-        return list_response(list_schema.dump(item_comp.teams))
+        item_team = dbc.add.team(args["name"], item_comp)
+        return item_response(schema.dump(item_team))
 
 
 @api.route("/<TID>")
@@ -46,5 +43,22 @@ class Teams(Resource):
     @jwt_required
     def delete(self, CID, TID):
         item_team = dbc.get.team(CID, TID)
+        if not item_team:
+            api.abort(codes.NOT_FOUND, f"Could not find team with id {TID} in competition with id {CID}.")
+
         dbc.delete.team(item_team)
-        return "deleted"
+        return {}, codes.NO_CONTENT
+
+    @jwt_required
+    def put(self, CID, TID):
+        args = team_parser.parse_args(strict=True)
+        name = args.get("name")
+        competition_id = args.get("competition_id")
+
+        item_team = dbc.get.team(CID, TID)
+        if not item_team:
+            api.abort(codes.NOT_FOUND, f"Could not find team with id {TID} in competition with id {CID}.")
+
+        item_team = dbc.edit.team(item_team, name=name, competition_id=competition_id)
+
+        return item_response(schema.dump(item_team))
diff --git a/server/app/core/controller/edit.py b/server/app/core/controller/edit.py
index 63e67b3c..0a1b190f 100644
--- a/server/app/core/controller/edit.py
+++ b/server/app/core/controller/edit.py
@@ -31,6 +31,17 @@ def slide(item, title=None, timer=None):
     return item
 
 
+def team(item_team, name=None, competition_id=None):
+    if name:
+        item_team.name = name
+    if competition_id:
+        item_team.competition_id = competition_id
+
+    db.session.commit()
+    db.session.refresh(item_team)
+    return item_team
+
+
 def competition(item, name=None, year=None, city_id=None):
     if name:
         item.name = name
diff --git a/server/app/core/controller/get.py b/server/app/core/controller/get.py
index 1b31ddda..f695deee 100644
--- a/server/app/core/controller/get.py
+++ b/server/app/core/controller/get.py
@@ -17,7 +17,7 @@ def question(CID, QID):
     slide_ids = set(
         [x.id for x in Slide.query.filter(Slide.competition_id == CID).all()]
     )  # TODO: Filter using database instead of creating a set of slide_ids
-    return Question.query.filter(Question.slide_id.in_(slide_ids) & (Question.id == QID))
+    return Question.query.filter(Question.slide_id.in_(slide_ids) & (Question.id == QID)).first()
 
 
 def _search(query, order_column, page=0, page_size=15, order=1):
diff --git a/server/app/core/parsers.py b/server/app/core/parsers.py
index a3bf2ba0..f053beb0 100644
--- a/server/app/core/parsers.py
+++ b/server/app/core/parsers.py
@@ -69,3 +69,8 @@ question_search_parser.add_argument("name", type=str, default=None, location="js
 question_search_parser.add_argument("slide_id", type=int, default=None, location="json")
 question_search_parser.add_argument("type_id", type=int, default=None, location="json")
 question_search_parser.add_argument("competition_id", type=int, default=None, location="json")
+
+###TEAM####
+team_parser = reqparse.RequestParser()
+team_parser.add_argument("name", type=str, location="json")
+team_parser.add_argument("competition_id", type=int, location="json")
-- 
GitLab