diff options
Diffstat (limited to 'pysite')
| -rw-r--r-- | pysite/views/main/jams/jam_team_list.py | 50 | ||||
| -rw-r--r-- | pysite/views/main/jams/team_view.py | 51 | ||||
| -rw-r--r-- | pysite/views/main/jams/user_team_list.py | 40 | ||||
| -rw-r--r-- | pysite/views/staff/jams/actions.py | 6 | ||||
| -rw-r--r-- | pysite/views/staff/jams/teams/view.py | 14 |
5 files changed, 146 insertions, 15 deletions
diff --git a/pysite/views/main/jams/jam_team_list.py b/pysite/views/main/jams/jam_team_list.py new file mode 100644 index 00000000..474c8f77 --- /dev/null +++ b/pysite/views/main/jams/jam_team_list.py @@ -0,0 +1,50 @@ +import logging + +from rethinkdb import ReqlNonExistenceError +from werkzeug.exceptions import NotFound + +from pysite.base_route import RouteView +from pysite.mixins import DBMixin, OAuthMixin + +log = logging.getLogger(__name__) + + +class JamsUserTeamListView(RouteView, DBMixin, OAuthMixin): + path = "/jams/teams/<int:jam_id>" + name = "jams.jam_team_list" + + table_name = "code_jam_teams" + 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"]) + .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") + raise NotFound() + + return self.render( + "main/jams/team_list.html", + jam=jam_data, + teams=jam_data["teams"], + member_ids=self.member_ids + ) + + def member_ids(self, members): + return [member["user_id"] for member in members] diff --git a/pysite/views/main/jams/team_view.py b/pysite/views/main/jams/team_view.py new file mode 100644 index 00000000..2d99828c --- /dev/null +++ b/pysite/views/main/jams/team_view.py @@ -0,0 +1,51 @@ +import logging + +from rethinkdb import ReqlNonExistenceError +from werkzeug.exceptions import NotFound + +from pysite.base_route import RouteView +from pysite.mixins import DBMixin, OAuthMixin + +log = logging.getLogger(__name__) + + +class JamsTeamView(RouteView, DBMixin, OAuthMixin): + path = "/jams/team/<string:team_id>" + name = "jams.team_view" + + table_name = "code_jam_teams" + + def get(self, team_id: str): + try: + query = self.db.query(self.table_name).get(team_id).merge( + lambda team: { + "members": + self.db.query("users") + .filter(lambda user: team["members"].contains(user["user_id"])) + .merge( + lambda user: { + "gitlab_username": 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] + } + ) + + team = self.db.run(query) + except ReqlNonExistenceError: + log.exception("Failed RethinkDB query") + raise NotFound() + + # check if the current user is a member of this team + # (this is for edition privileges) + is_own_team = self.logged_in and self.user_data["user_id"] in [member["user_id"] for member in team["members"]] + + return self.render( + "main/jams/team_view.html", + team=team, is_own_team=is_own_team + ) diff --git a/pysite/views/main/jams/user_team_list.py b/pysite/views/main/jams/user_team_list.py new file mode 100644 index 00000000..272c0a74 --- /dev/null +++ b/pysite/views/main/jams/user_team_list.py @@ -0,0 +1,40 @@ +import rethinkdb + +from pysite.base_route import RouteView +from pysite.mixins import DBMixin, OAuthMixin + + +class JamsUserTeamListView(RouteView, DBMixin, OAuthMixin): + path = "/jams/my_teams" + name = "jams.user_team_list" + + def get(self): + # list teams a user is (or was) a part of + if not self.user_data: + return self.redirect_login() + + query = self.db.query("code_jam_teams").filter( + lambda team: team["members"].contains(self.user_data["user_id"]) + ).merge( + lambda team: { + "members": + self.db.query("users") + .filter(lambda user: team["members"].contains(user["user_id"])) + .merge(lambda user: { + "gitlab_username": + 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] + } + ).order_by(rethinkdb.desc("jam.number")) + teams = self.db.run(query) + + return self.render( + "main/jams/team_list.html", + user_teams=True, + teams=teams + ) diff --git a/pysite/views/staff/jams/actions.py b/pysite/views/staff/jams/actions.py index de9e2d2c..3f8b4c20 100644 --- a/pysite/views/staff/jams/actions.py +++ b/pysite/views/staff/jams/actions.py @@ -335,10 +335,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"]) .coerce_to("array") } ) 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") } ) |