aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/views/staff
diff options
context:
space:
mode:
Diffstat (limited to 'pysite/views/staff')
-rw-r--r--pysite/views/staff/jams/actions.py27
-rw-r--r--pysite/views/staff/jams/edit_info.py2
-rw-r--r--pysite/views/staff/jams/teams/view.py14
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")
}
)