diff options
Diffstat (limited to '')
| -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] +        ) | 
