From 720fcd40d46474cab3d8fef1e98ca40fe0058156 Mon Sep 17 00:00:00 2001 From: James Wang Date: Mon, 18 Apr 2016 16:29:33 -0400 Subject: [PATCH] Implement different solve bonuses --- server/api/admin.py | 3 ++- server/api/models.py | 13 +++++++++++-- server/api/problem.py | 5 ++++- web/js/admin.js | 8 +++++++- web/pages/admin/problems.html | 21 +++++++++++++++++++++ 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/server/api/admin.py b/server/api/admin.py index f79a2e0..57500e1 100644 --- a/server/api/admin.py +++ b/server/api/admin.py @@ -25,7 +25,8 @@ def problem_data(): "value": problem.value, "threshold": problem.threshold, "weightmap": problem.weightmap, - "grader_contents": open(problem.grader, "r").read() + "grader_contents": open(problem.grader, "r").read(), + "bonus": problem.bonus }) problems_return.sort(key=lambda prob: prob["value"]) return { "success": 1, "problems": problems_return } diff --git a/server/api/models.py b/server/api/models.py index 70f6d09..93cd2be 100644 --- a/server/api/models.py +++ b/server/api/models.py @@ -71,7 +71,14 @@ class Teams(db.Model): return members def points(self): - bonuses = [5, 3, 1] # TODO: Make this a setting in the web interface + bonuses = [ + [0, 0, 0], + [3, 2, 1], + [5, 3, 1], + [8, 5, 3], + [10, 8, 6], + [20, 12, 8] + ] points = 0 # TODO: use joins @@ -80,7 +87,7 @@ class Teams(db.Model): problem = Problems.query.filter_by(pid=solve.pid).first() multiplier = 1 if solve.bonus != -1: - multiplier += bonuses[solve.bonus-1]/100.0 + multiplier += bonuses[problem.bonus][solve.bonus-1]/100.0 points += round(problem.value*multiplier) return points @@ -152,6 +159,7 @@ class Problems(db.Model): threshold = db.Column(db.Integer) weightmap = db.Column(db.PickleType) grader = db.Column(db.Text) + bonus = db.Column(db.Integer) def __init__(self, pid, title, category, description, value, hint="", autogen=False, bonus=0, threshold=0, weightmap={}): self.pid = pid @@ -163,6 +171,7 @@ class Problems(db.Model): self.autogen = autogen self.threshold = threshold self.weightmap = weightmap + self.bonus = bonus class Files(db.Model): fid = db.Column(db.Integer, primary_key=True) diff --git a/server/api/problem.py b/server/api/problem.py index 34faf7c..77e9c41 100644 --- a/server/api/problem.py +++ b/server/api/problem.py @@ -24,6 +24,7 @@ def problem_add(): hint = request.form["hint"] value = request.form["value"] grader_contents = request.form["grader_contents"] + bonus = request.form["bonus"] pid = utils.generate_string() while Problems.query.filter_by(pid=pid).first(): pid = utils.generate_string() @@ -37,7 +38,7 @@ def problem_add(): except Exception, e: raise WebException("There is a syntax error in the grader: %s" % e) - problem = Problems(pid, title, category, description, value, hint=hint) + problem = Problems(pid, title, category, description, value, hint=hint, bonus=bonus) db.session.add(problem) db.session.commit() @@ -92,6 +93,7 @@ def problem_update(): hint = request.form["hint"] value = request.form["value"] grader_contents = request.form["grader_contents"] + bonus = request.form["bonus"] try: exec(grader_contents) except Exception, e: @@ -104,6 +106,7 @@ def problem_update(): problem.description = description problem.hint = hint problem.value = value + problem.bonus = bonus grader = open(problem.grader, "w") grader.write(grader_contents) diff --git a/web/js/admin.js b/web/js/admin.js index ad4e3a5..a24f8f0 100644 --- a/web/js/admin.js +++ b/web/js/admin.js @@ -9,6 +9,8 @@ var create_problem = function() { var data = $("#new_problem_form").serializeObject(); var grader_contents = ace.edit("new_grader").getValue(); data["grader_contents"] = grader_contents; + var bonus = $("#bonus").val(); + data["bonus"] = bonus; $(input).attr("disabled", "disabled"); api_call("POST", "/api/problem/add", data, function(result) { if (result["success"] == 1) { @@ -31,10 +33,13 @@ var create_problem = function() { var update_problem = function(form_id) { var input = "#" + form_id + " input"; var data = $("#" + form_id).serializeObject(); - pid = data["pid"]; + var pid = data["pid"]; var grader_contents = ace.edit(pid + "_grader").getValue(); data["grader_contents"] = grader_contents; + var bonus = $("#" + pid + "_bonus").val(); + console.log(bonus); + data["bonus"] = bonus; $(input).attr("disabled", "disabled"); api_call("POST", "/api/problem/update", data, function(result) { @@ -47,6 +52,7 @@ var update_problem = function(form_id) { $(input).removeAttr("disabled"); }); } + console.log(result); }, function(jqXHR, status, error) { var result = jqXHR["responseText"]; display_message(pid + "_status", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() { diff --git a/web/pages/admin/problems.html b/web/pages/admin/problems.html index 9c253b1..f62581f 100644 --- a/web/pages/admin/problems.html +++ b/web/pages/admin/problems.html @@ -34,6 +34,17 @@
+
+ + +

@@ -61,6 +72,16 @@

+ + +