aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/views/main/jams/retract.py
diff options
context:
space:
mode:
Diffstat (limited to 'pysite/views/main/jams/retract.py')
-rw-r--r--pysite/views/main/jams/retract.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/pysite/views/main/jams/retract.py b/pysite/views/main/jams/retract.py
new file mode 100644
index 00000000..277426b5
--- /dev/null
+++ b/pysite/views/main/jams/retract.py
@@ -0,0 +1,83 @@
+from werkzeug.exceptions import BadRequest
+
+from pysite.base_route import RouteView
+from pysite.decorators import csrf
+from pysite.mixins import DBMixin, OAuthMixin
+
+BANNABLE_STATES = ("preparing", "running")
+
+
+class JamsProfileView(RouteView, DBMixin, OAuthMixin):
+ path = "/jams/retract"
+ name = "jams.retract"
+
+ table_name = "code_jam_participants"
+ infractions_table = "code_jam_infractions"
+ jams_table = "code_jams"
+ responses_table = "code_jam_responses"
+
+ def get(self):
+ if not self.user_data:
+ return self.redirect_login()
+
+ user_id = self.user_data["user_id"]
+ participant = self.db.get(self.table_name, user_id)
+
+ banned = False
+
+ if participant:
+ responses = self.db.run(self.db.query(self.responses_table).filter({"snowflake": user_id}), coerce=list)
+
+ for response in responses:
+ jam = response["jam"]
+ jam_obj = self.db.get(self.jams_table, jam)
+
+ if jam_obj:
+ if jam_obj["state"] in BANNABLE_STATES:
+ banned = True
+ break
+
+ return self.render(
+ "main/jams/retract.html", participant=participant, banned=banned
+ )
+
+ @csrf
+ def post(self):
+ if not self.user_data:
+ return self.redirect_login()
+
+ user_id = self.user_data["user_id"]
+ participant = self.db.get(self.table_name, user_id)
+
+ if not participant:
+ return BadRequest()
+
+ banned = False
+
+ responses = self.db.run(self.db.query(self.responses_table).filter({"snowflake": user_id}), coerce=list)
+
+ for response in responses:
+ jam = response["jam"]
+ jam_obj = self.db.get(self.jams_table, jam)
+
+ if jam_obj:
+ if jam_obj["state"] in BANNABLE_STATES:
+ banned = True
+
+ self.db.delete(self.responses_table, response["id"])
+
+ self.db.delete(self.table_name, participant["id"])
+
+ if banned:
+ self.db.insert(
+ self.infractions_table, {
+ "participant": user_id,
+ "reason": "Automatic ban: Removed jammer profile in the middle of a code jam",
+ "number": -1,
+ "decremented_for": []
+ }
+ )
+
+ return self.render(
+ "main/jams/retracted.html", participant=participant, banned=banned
+ )