diff options
author | 2018-06-23 23:13:03 +0000 | |
---|---|---|
committer | 2018-06-23 23:13:03 +0000 | |
commit | 3c1348a959937bb1e6ee3fabe9892136e5b13167 (patch) | |
tree | ba9172b2b0a6d3fdbab69d19dc1fa93053c04a93 | |
parent | [API] Check for DB-nuking empty data in users POST (diff) | |
parent | [Jams/Teams] Hopefully optimize jam team list (diff) |
Merge branch 'momo/optimize-teams-list' into 'master'
Optimize team lists and better relations
See merge request python-discord/projects/site!10
-rw-r--r-- | pysite/migrations/tables/code_jam_teams/__init__.py | 0 | ||||
-rw-r--r-- | pysite/migrations/tables/code_jam_teams/v1.py | 13 | ||||
-rw-r--r-- | pysite/migrations/tables/code_jams/v2.py | 10 | ||||
-rw-r--r-- | pysite/tables.py | 3 | ||||
-rw-r--r-- | pysite/views/main/jams/jam_team_list.py | 38 | ||||
-rw-r--r-- | pysite/views/main/jams/team_edit_repo.py | 5 | ||||
-rw-r--r-- | pysite/views/main/jams/team_view.py | 5 | ||||
-rw-r--r-- | pysite/views/main/jams/user_team_list.py | 5 | ||||
-rw-r--r-- | pysite/views/staff/jams/actions.py | 15 |
9 files changed, 57 insertions, 37 deletions
diff --git a/pysite/migrations/tables/code_jam_teams/__init__.py b/pysite/migrations/tables/code_jam_teams/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/pysite/migrations/tables/code_jam_teams/__init__.py diff --git a/pysite/migrations/tables/code_jam_teams/v1.py b/pysite/migrations/tables/code_jam_teams/v1.py new file mode 100644 index 00000000..165d3100 --- /dev/null +++ b/pysite/migrations/tables/code_jam_teams/v1.py @@ -0,0 +1,13 @@ +def run(db, table, table_obj): + """ + Associate the ID of each team's code jam (team -> jam) + """ + + for document in db.get_all(table): + if "jam" not in document: + # find the code jam containing this team + for jam in db.get_all("code_jams"): + if document["id"] in jam["teams"]: + document["jam"] = jam["number"] + db.insert(table, document, conflict="update", durability="soft") + db.sync(table) diff --git a/pysite/migrations/tables/code_jams/v2.py b/pysite/migrations/tables/code_jams/v2.py new file mode 100644 index 00000000..df4752c8 --- /dev/null +++ b/pysite/migrations/tables/code_jams/v2.py @@ -0,0 +1,10 @@ +def run(db, table, table_obj): + """ + Clean list of teams from teams that do not exist anymore. + """ + for document in db.get_all(table): + for team_id in document["teams"]: + if db.get("code_jam_teams", team_id) is None: + document["teams"].remove(team_id) + db.insert(table, document, conflict="update", durability="soft") + db.sync(table) diff --git a/pysite/tables.py b/pysite/tables.py index 191b52bd..c7072909 100644 --- a/pysite/tables.py +++ b/pysite/tables.py @@ -94,7 +94,8 @@ TABLES = { "id", # uuid "name", # str "members", # list[str] - "repo" # str + "repo", # str + "jam" # int ]) ), diff --git a/pysite/views/main/jams/jam_team_list.py b/pysite/views/main/jams/jam_team_list.py index 0eb43a5a..49587e36 100644 --- a/pysite/views/main/jams/jam_team_list.py +++ b/pysite/views/main/jams/jam_team_list.py @@ -1,6 +1,5 @@ import logging -from rethinkdb import ReqlNonExistenceError from werkzeug.exceptions import NotFound from pysite.base_route import RouteView @@ -17,32 +16,25 @@ class JamsTeamListView(RouteView, DBMixin, OAuthMixin): jams_table = "code_jams" def get(self, jam_id): - try: - query = self.db.query(self.jams_table).get(jam_id).merge( - lambda jam_obj: { - "teams": - self.db.query(self.table_name) - .filter(lambda team_row: jam_obj["teams"].contains(team_row["id"])) - .pluck(["id", "name", "members", "repo"]) - .merge( - lambda team: { - "members": - self.db.query("users") - .filter(lambda user: team["members"].contains(user["user_id"])) - .coerce_to("array") - }).coerce_to("array") - } - ) - - jam_data = self.db.run(query) - except ReqlNonExistenceError: - log.exception("Failed RethinkDB query") + jam_obj = self.db.get(self.jams_table, jam_id) + if not jam_obj: raise NotFound() + query = self.db.query(self.table_name).get_all(self.table_name, *jam_obj["teams"]).pluck( + ["id", "name", "members", "repo"]).merge( + lambda team: { + "members": + self.db.query("users") + .filter(lambda user: team["members"].contains(user["user_id"])) + .coerce_to("array") + }).coerce_to("array") + + jam_obj["teams"] = self.db.run(query) + return self.render( "main/jams/team_list.html", - jam=jam_data, - teams=jam_data["teams"], + jam=jam_obj, + teams=jam_obj["teams"], member_ids=self.member_ids ) diff --git a/pysite/views/main/jams/team_edit_repo.py b/pysite/views/main/jams/team_edit_repo.py index 03f23f17..03e752bc 100644 --- a/pysite/views/main/jams/team_edit_repo.py +++ b/pysite/views/main/jams/team_edit_repo.py @@ -33,10 +33,7 @@ class JamsTeamEditRepo(APIView, DBMixin, OAuthMixin): try: query = self.db.query(self.table_name).get(team_id).merge( lambda team: { - "jam": - self.db.query("code_jams").filter( - lambda jam: jam["teams"].contains(team["id"]) - ).coerce_to("array")[0] + "jam": self.db.query("code_jams").get(team["jam"]) } ) diff --git a/pysite/views/main/jams/team_view.py b/pysite/views/main/jams/team_view.py index 2d99828c..8be8bc0f 100644 --- a/pysite/views/main/jams/team_view.py +++ b/pysite/views/main/jams/team_view.py @@ -29,10 +29,7 @@ class JamsTeamView(RouteView, DBMixin, OAuthMixin): ).coerce_to("array")[0]["gitlab_username"] } ).coerce_to("array"), - "jam": - self.db.query("code_jams").filter( - lambda jam: jam["teams"].contains(team["id"]) - ).coerce_to("array")[0] + "jam": self.db.query("code_jams").get(team["jam"]) } ) diff --git a/pysite/views/main/jams/user_team_list.py b/pysite/views/main/jams/user_team_list.py index 272c0a74..226cc4b0 100644 --- a/pysite/views/main/jams/user_team_list.py +++ b/pysite/views/main/jams/user_team_list.py @@ -25,10 +25,7 @@ class JamsUserTeamListView(RouteView, DBMixin, OAuthMixin): self.db.query("code_jam_participants").filter({"id": user["user_id"]}) .coerce_to("array")[0]["gitlab_username"] }).coerce_to("array"), - "jam": - self.db.query("code_jams").filter( - lambda jam: jam["teams"].contains(team["id"]) - ).coerce_to("array")[0] + "jam": self.db.query("code_jams").get(team["jam"]) } ).order_by(rethinkdb.desc("jam.number")) teams = self.db.run(query) diff --git a/pysite/views/staff/jams/actions.py b/pysite/views/staff/jams/actions.py index 3f8b4c20..c97f0d8c 100644 --- a/pysite/views/staff/jams/actions.py +++ b/pysite/views/staff/jams/actions.py @@ -221,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) @@ -538,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}) |