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 @@
+
+
+
+