diff options
Diffstat (limited to 'pysite/views/staff')
| -rw-r--r-- | pysite/views/staff/jams/actions.py | 27 | ||||
| -rw-r--r-- | pysite/views/staff/jams/edit_info.py | 2 | ||||
| -rw-r--r-- | pysite/views/staff/jams/teams/view.py | 14 |
3 files changed, 25 insertions, 18 deletions
diff --git a/pysite/views/staff/jams/actions.py b/pysite/views/staff/jams/actions.py index 3cacbb50..761ba7d6 100644 --- a/pysite/views/staff/jams/actions.py +++ b/pysite/views/staff/jams/actions.py @@ -47,7 +47,11 @@ class ActionView(APIView, DBMixin, RMQMixin): @csrf @require_roles(*ALL_STAFF_ROLES) def post(self): - action = request.form.get("action") + if request.is_json: + data = request.get_json(force=True) + action = data["action"] if "action" in data else None + else: + action = request.form.get("action") if action not in POST_ACTIONS: return self.error(ErrorCodes.incorrect_parameters) @@ -217,7 +221,8 @@ class ActionView(APIView, DBMixin, RMQMixin): team = { "name": f"{adjective} {noun}".title(), - "members": [] + "members": [], + "jam": jam } result = self.db.insert(self.teams_table, team) @@ -331,10 +336,8 @@ class ActionView(APIView, DBMixin, RMQMixin): .coerce_to("array"), "teams": self.db.query(self.teams_table) - .outer_join(self.db.query(self.table_name), - lambda team_row, jams_row: jams_row["teams"].contains(team_row["id"])) - .pluck({"left": ["id", "name", "members"]}) - .zip() + .filter(lambda team_row: jam_obj["teams"].contains(team_row["id"])) + .pluck(["id", "name", "members", "jam"]) .coerce_to("array") } ) @@ -536,6 +539,18 @@ class ActionView(APIView, DBMixin, RMQMixin): ErrorCodes.incorrect_parameters, "Team ID required" ) + team_obj = self.db.get(self.teams_table, team) + + if not team_obj: + return self.error( + ErrorCodes.incorrect_parameters, "Unknown team ID" + ) + + jam_obj = self.db.get(self.table_name, team_obj["jam"]) + if jam_obj: + jam_obj["teams"].remove(team) + self.db.insert(self.table_name, jam_obj, conflict="update") + self.db.delete(self.teams_table, team) return jsonify({"result": True}) diff --git a/pysite/views/staff/jams/edit_info.py b/pysite/views/staff/jams/edit_info.py index ad0d3d41..4944ae67 100644 --- a/pysite/views/staff/jams/edit_info.py +++ b/pysite/views/staff/jams/edit_info.py @@ -8,7 +8,7 @@ from pysite.mixins import DBMixin from pysite.rst import render REQUIRED_KEYS = ["info_rst", "repo", "task_rst", "theme"] -ALLOWED_STATES = ["planning", "announced", "finished"] +ALLOWED_STATES = ["planning", "announced", "preparing", "finished"] class StaffView(RouteView, DBMixin): diff --git a/pysite/views/staff/jams/teams/view.py b/pysite/views/staff/jams/teams/view.py index 6b30f9a2..662cc084 100644 --- a/pysite/views/staff/jams/teams/view.py +++ b/pysite/views/staff/jams/teams/view.py @@ -61,18 +61,10 @@ class StaffView(RouteView, DBMixin): .coerce_to("array"), # Coerce the document stream into an array "form": self.db.query(self.forms_table).get(jam), # Just get the correct form object "teams": - # Query the teams table self.db.query(self.table_name) - # Join the teams table against the jams table, to find all of the teams for this - # specific jam - we can't simply filter because of the one-to-many relationship, - # so we must use an inner join with a predicate function. This function is still - # run on the server, however - .inner_join(self.db.query(self.jams_table), - lambda team_row, jams_row: jams_row["teams"].contains(team_row["id"])) - # Only take the ID, name and members of each team, discard everything else - .pluck({"left": ["id", "name", "members"]}) - .zip() # Combine the left and right documents together - .coerce_to("array") # Coerce the document stream into an array + .filter(lambda team_row: jam_obj["teams"].contains(team_row["id"])) + .pluck(["id", "name", "members"]) + .coerce_to("array") } ) |