diff options
Diffstat (limited to 'pysite/views/staff/jams')
-rw-r--r-- | pysite/views/staff/jams/actions.py | 36 | ||||
-rw-r--r-- | pysite/views/staff/jams/create.py | 49 | ||||
-rw-r--r-- | pysite/views/staff/jams/edit_basics.py | 58 | ||||
-rw-r--r-- | pysite/views/staff/jams/edit_ending.py | 54 | ||||
-rw-r--r-- | pysite/views/staff/jams/edit_info.py | 54 | ||||
-rw-r--r-- | pysite/views/staff/jams/index.py | 15 |
6 files changed, 266 insertions, 0 deletions
diff --git a/pysite/views/staff/jams/actions.py b/pysite/views/staff/jams/actions.py new file mode 100644 index 00000000..93a7f2c7 --- /dev/null +++ b/pysite/views/staff/jams/actions.py @@ -0,0 +1,36 @@ +from flask import jsonify, request + +from pysite.base_route import APIView +from pysite.constants import ALL_STAFF_ROLES, ErrorCodes +from pysite.decorators import csrf, require_roles +from pysite.mixins import DBMixin + +ACTIONS = ["state"] +KEYS = ["action"] + + +class ActionView(APIView, DBMixin): + path = "/jams/action/" + name = "jams.action" + table_name = "code_jams" + + @csrf + @require_roles(*ALL_STAFF_ROLES) + def post(self): + action = request.args.get("action") + + if action not in ACTIONS: + return self.error(ErrorCodes.incorrect_parameters) + + if action == "state": + jam = int(request.args.get("jam")) + state = request.args.get("state") + + if not all((jam, state)): + return self.error(ErrorCodes.incorrect_parameters) + + jam_obj = self.db.get(self.table_name, jam) + jam_obj["state"] = state + self.db.insert(self.table_name, jam_obj, conflict="update") + + return jsonify({}) diff --git a/pysite/views/staff/jams/create.py b/pysite/views/staff/jams/create.py new file mode 100644 index 00000000..e88056c5 --- /dev/null +++ b/pysite/views/staff/jams/create.py @@ -0,0 +1,49 @@ +from flask import redirect, request, url_for +from werkzeug.exceptions import BadRequest + +from pysite.base_route import RouteView +from pysite.constants import ALL_STAFF_ROLES +from pysite.decorators import csrf, require_roles +from pysite.mixins import DBMixin + +REQUIRED_KEYS = ["title", "date_start", "date_end"] + + +class StaffView(RouteView, DBMixin): + path = "/jams/create" + name = "jams.create" + table_name = "code_jams" + + @require_roles(*ALL_STAFF_ROLES) + def get(self): + number = self.get_next_number() + return self.render("staff/jams/create.html", number=number) + + @require_roles(*ALL_STAFF_ROLES) + @csrf + def post(self): + data = {} + + for key in REQUIRED_KEYS: + arg = request.form.get(key) + + if not arg: + return BadRequest() + + data[key] = arg + + data["state"] = "planning" + data["number"] = self.get_next_number() + + self.db.insert(self.table_name, data) + + return redirect(url_for("staff.jams.index")) + + def get_next_number(self) -> int: + count = self.db.run(self.table.count(), coerce=int) + + if count: + max_num = self.db.run(self.table.max("number"))["number"] + + return max_num + 1 + return 1 diff --git a/pysite/views/staff/jams/edit_basics.py b/pysite/views/staff/jams/edit_basics.py new file mode 100644 index 00000000..eb56e7d4 --- /dev/null +++ b/pysite/views/staff/jams/edit_basics.py @@ -0,0 +1,58 @@ +import datetime + +from flask import redirect, request, url_for +from werkzeug.exceptions import BadRequest, NotFound + +from pysite.base_route import RouteView +from pysite.constants import ALL_STAFF_ROLES +from pysite.decorators import csrf, require_roles +from pysite.mixins import DBMixin + +REQUIRED_KEYS = ["title", "date_start", "date_end"] + + +class StaffView(RouteView, DBMixin): + path = "/jams/<int:jam>/edit/basics" + name = "jams.edit.basics" + table_name = "code_jams" + + @require_roles(*ALL_STAFF_ROLES) + def get(self, jam): + jam_obj = self.db.get(self.table_name, jam) + + if not jam_obj: + return NotFound() + return self.render("staff/jams/edit_basics.html", jam=jam_obj) + + @require_roles(*ALL_STAFF_ROLES) + @csrf + def post(self, jam): + jam_obj = self.db.get(self.table_name, jam) + + if not jam_obj: + return NotFound() + + if not jam_obj["state"] == "planning": + return BadRequest() + + for key in REQUIRED_KEYS: + arg = request.form.get(key) + + if not arg: + return BadRequest() + + jam_obj[key] = arg + + # Convert given datetime strings into actual objects, adding timezones to keep rethinkdb happy + date_start = datetime.datetime.strptime(jam_obj["date_start"], "%Y-%m-%d %H:%M") + date_start = date_start.replace(tzinfo=datetime.timezone.utc) + + date_end = datetime.datetime.strptime(jam_obj["date_end"], "%Y-%m-%d %H:%M") + date_end = date_end.replace(tzinfo=datetime.timezone.utc) + + jam_obj["date_start"] = date_start + jam_obj["date_end"] = date_end + + self.db.insert(self.table_name, jam_obj, conflict="replace") + + return redirect(url_for("staff.jams.index")) diff --git a/pysite/views/staff/jams/edit_ending.py b/pysite/views/staff/jams/edit_ending.py new file mode 100644 index 00000000..69b91e29 --- /dev/null +++ b/pysite/views/staff/jams/edit_ending.py @@ -0,0 +1,54 @@ +from flask import redirect, request, url_for +from werkzeug.exceptions import BadRequest, NotFound + +from pysite.base_route import RouteView +from pysite.constants import ALL_STAFF_ROLES +from pysite.decorators import csrf, require_roles +from pysite.mixins import DBMixin +from pysite.rst import render + +REQUIRED_KEYS = ["end_rst"] + + +class StaffView(RouteView, DBMixin): + path = "/jams/<int:jam>/edit/ending" + name = "jams.edit.ending" + table_name = "code_jams" + + @require_roles(*ALL_STAFF_ROLES) + def get(self, jam): + jam_obj = self.db.get(self.table_name, jam) + + if not jam_obj: + return NotFound() + + if not jam_obj["state"] == "judging": + return BadRequest() + + return self.render("staff/jams/edit_ending.html", jam=jam_obj) + + @require_roles(*ALL_STAFF_ROLES) + @csrf + def post(self, jam): + jam_obj = self.db.get(self.table_name, jam) + + if not jam_obj: + return NotFound() + + if not jam_obj["state"] == "judging": + return BadRequest() + + print(request.form) + for key in REQUIRED_KEYS: + arg = request.form.get(key) + + if not arg: + return BadRequest() + + jam_obj[key] = arg + + jam_obj["end_html"] = render(jam_obj["end_rst"], link_headers=False)["html"] + + self.db.insert(self.table_name, jam_obj, conflict="replace") + + return redirect(url_for("staff.jams.index")) diff --git a/pysite/views/staff/jams/edit_info.py b/pysite/views/staff/jams/edit_info.py new file mode 100644 index 00000000..2ec67ebb --- /dev/null +++ b/pysite/views/staff/jams/edit_info.py @@ -0,0 +1,54 @@ +from flask import redirect, request, url_for +from werkzeug.exceptions import BadRequest, NotFound + +from pysite.base_route import RouteView +from pysite.constants import ALL_STAFF_ROLES +from pysite.decorators import csrf, require_roles +from pysite.mixins import DBMixin +from pysite.rst import render + +REQUIRED_KEYS = ["repo", "task_rst", "theme"] +ALLOWED_STATES = ["planning", "info"] + + +class StaffView(RouteView, DBMixin): + path = "/jams/<int:jam>/edit/info" + name = "jams.edit.info" + table_name = "code_jams" + + @require_roles(*ALL_STAFF_ROLES) + def get(self, jam): + jam_obj = self.db.get(self.table_name, jam) + + if not jam_obj: + return NotFound() + + if not jam_obj["state"] in ALLOWED_STATES: + return BadRequest() + return self.render("staff/jams/edit_info.html", jam=jam_obj) + + @require_roles(*ALL_STAFF_ROLES) + @csrf + def post(self, jam): + jam_obj = self.db.get(self.table_name, jam) + + if not jam_obj: + return NotFound() + + if not jam_obj["state"] in ALLOWED_STATES: + return BadRequest() + + print(request.form) + for key in REQUIRED_KEYS: + arg = request.form.get(key) + + if not arg: + return BadRequest() + + jam_obj[key] = arg + + jam_obj["task_html"] = render(jam_obj["task_rst"], link_headers=False)["html"] + + self.db.insert(self.table_name, jam_obj, conflict="replace") + + return redirect(url_for("staff.jams.index")) diff --git a/pysite/views/staff/jams/index.py b/pysite/views/staff/jams/index.py new file mode 100644 index 00000000..40a8387c --- /dev/null +++ b/pysite/views/staff/jams/index.py @@ -0,0 +1,15 @@ +from pysite.base_route import RouteView +from pysite.constants import ALL_STAFF_ROLES, JAM_STATES +from pysite.decorators import require_roles +from pysite.mixins import DBMixin + + +class StaffView(RouteView, DBMixin): + path = "/jams" + name = "jams.index" + table_name = "code_jams" + + @require_roles(*ALL_STAFF_ROLES) + def get(self): + jams = self.db.get_all(self.table_name) + return self.render("staff/jams/index.html", jams=jams, states=JAM_STATES) |