diff options
author | 2018-05-19 13:53:53 +0100 | |
---|---|---|
committer | 2018-05-19 13:53:53 +0100 | |
commit | 4a66fe0427aaacac3cbfdf6b2ea47bb3e056e88b (patch) | |
tree | 581cef536c213ed00cc6ca48998f67b0df7e0b5b /pysite | |
parent | Fix some small question-editing bugs (diff) |
[Jams] Linting and infractions
Diffstat (limited to 'pysite')
-rw-r--r-- | pysite/tables.py | 4 | ||||
-rw-r--r-- | pysite/views/staff/jams/actions.py | 39 | ||||
-rw-r--r-- | pysite/views/staff/jams/forms/questions_edit.py | 6 | ||||
-rw-r--r-- | pysite/views/staff/jams/forms/view.py | 2 | ||||
-rw-r--r-- | pysite/views/staff/jams/infractions/__init__.py | 0 | ||||
-rw-r--r-- | pysite/views/staff/jams/infractions/view.py | 29 |
6 files changed, 71 insertions, 9 deletions
diff --git a/pysite/tables.py b/pysite/tables.py index 67503cdb..c180e161 100644 --- a/pysite/tables.py +++ b/pysite/tables.py @@ -97,8 +97,8 @@ TABLES = { "code_jam_infractions": Table( # Individual infractions for each user primary_key="id", keys=sorted([ - "snowflake", # int - "participant", # int + "id", # uuid + "participant", # str "reason", # str "number" # int (optionally -1 for permanent) ]) diff --git a/pysite/views/staff/jams/actions.py b/pysite/views/staff/jams/actions.py index 3683db39..f08b3635 100644 --- a/pysite/views/staff/jams/actions.py +++ b/pysite/views/staff/jams/actions.py @@ -6,8 +6,8 @@ from pysite.decorators import csrf, require_roles from pysite.mixins import DBMixin GET_ACTIONS = ["questions"] -POST_ACTIONS = ["associate_question", "disassociate_question", "questions", "state"] -DELETE_ACTIONS = ["question"] +POST_ACTIONS = ["associate_question", "disassociate_question", "infraction", "questions", "state"] +DELETE_ACTIONS = ["infraction", "question"] KEYS = ["action"] QUESTION_KEYS = ["optional", "title", "type"] @@ -19,6 +19,7 @@ class ActionView(APIView, DBMixin): table_name = "code_jams" forms_table = "code_jam_forms" + infractions_table = "code_jam_infractions" questions_table = "code_jam_questions" @csrf @@ -168,6 +169,25 @@ class ActionView(APIView, DBMixin): return jsonify({"id": result["generated_keys"][0]}) + if action == "infraction": + participant = request.args.get("participant") + reason = request.args.get("reason") + + if not participant or not reason or "number" not in request.args: + return self.error( + ErrorCodes.incorrect_parameters, "Infractions must have a participant, reason and number" + ) + + number = int(request.args.get("number")) + + result = self.db.insert(self.infractions_table, { + "participant": participant, + "reason": reason, + "number": number + }) + + return jsonify({"id": result["generated_keys"][0]}) + @csrf @require_roles(*ALL_STAFF_ROLES) def delete(self): @@ -195,3 +215,18 @@ class ActionView(APIView, DBMixin): self.db.insert(self.forms_table, form_obj, conflict="replace") return jsonify({"id": question}) + + if action == "infraction": + infraction = request.args.get("id") + + if not infraction: + return self.error(ErrorCodes.incorrect_parameters, "Missing key id") + + infraction_obj = self.db.get(self.infractions_table, infraction) + + if not infraction_obj: + return self.error(ErrorCodes.incorrect_parameters, f"Unknown infraction: {infraction}") + + self.db.delete(self.infractions_table, infraction) + + return jsonify({"id": infraction_obj["id"]}) diff --git a/pysite/views/staff/jams/forms/questions_edit.py b/pysite/views/staff/jams/forms/questions_edit.py index cbc5158e..4de06793 100644 --- a/pysite/views/staff/jams/forms/questions_edit.py +++ b/pysite/views/staff/jams/forms/questions_edit.py @@ -1,11 +1,11 @@ import json -from flask import request, redirect, url_for -from werkzeug.exceptions import NotFound, BadRequest +from flask import redirect, request, url_for +from werkzeug.exceptions import BadRequest, NotFound from pysite.base_route import RouteView from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import require_roles, csrf +from pysite.decorators import csrf, require_roles from pysite.mixins import DBMixin REQUIRED_KEYS = ["title", "date_start", "date_end"] diff --git a/pysite/views/staff/jams/forms/view.py b/pysite/views/staff/jams/forms/view.py index eaa910f2..0c73bc58 100644 --- a/pysite/views/staff/jams/forms/view.py +++ b/pysite/views/staff/jams/forms/view.py @@ -1,5 +1,3 @@ -from werkzeug.exceptions import NotFound - from pysite.base_route import RouteView from pysite.constants import ALL_STAFF_ROLES from pysite.decorators import require_roles diff --git a/pysite/views/staff/jams/infractions/__init__.py b/pysite/views/staff/jams/infractions/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/pysite/views/staff/jams/infractions/__init__.py diff --git a/pysite/views/staff/jams/infractions/view.py b/pysite/views/staff/jams/infractions/view.py new file mode 100644 index 00000000..235f99ac --- /dev/null +++ b/pysite/views/staff/jams/infractions/view.py @@ -0,0 +1,29 @@ +from pysite.base_route import RouteView +from pysite.constants import ALL_STAFF_ROLES +from pysite.decorators import require_roles +from pysite.mixins import DBMixin + +REQUIRED_KEYS = ["title", "date_start", "date_end"] + + +class StaffView(RouteView, DBMixin): + path = "/jams/infractions" + name = "jams.infractions" + + table_name = "code_jam_infractions" + users_table = "users" + + @require_roles(*ALL_STAFF_ROLES) + def get(self): + infractions = self.db.get_all(self.table_name) + + for document in infractions: + user_obj = self.db.get(self.users_table, document["participant"]) + + if user_obj: + document["participant"] = user_obj + + return self.render( + "staff/jams/infractions/view.html", infractions=infractions, + infraction_ids=[i["id"] for i in infractions] + ) |