aboutsummaryrefslogtreecommitdiffstats
path: root/pysite
diff options
context:
space:
mode:
authorGravatar Gareth Coles <[email protected]>2018-05-19 13:53:53 +0100
committerGravatar Gareth Coles <[email protected]>2018-05-19 13:53:53 +0100
commit4a66fe0427aaacac3cbfdf6b2ea47bb3e056e88b (patch)
tree581cef536c213ed00cc6ca48998f67b0df7e0b5b /pysite
parentFix some small question-editing bugs (diff)
[Jams] Linting and infractions
Diffstat (limited to 'pysite')
-rw-r--r--pysite/tables.py4
-rw-r--r--pysite/views/staff/jams/actions.py39
-rw-r--r--pysite/views/staff/jams/forms/questions_edit.py6
-rw-r--r--pysite/views/staff/jams/forms/view.py2
-rw-r--r--pysite/views/staff/jams/infractions/__init__.py0
-rw-r--r--pysite/views/staff/jams/infractions/view.py29
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]
+ )