Add basic implementation for creating new problems
This commit is contained in:
parent
bb4d106130
commit
c8efdd3df4
6 changed files with 59 additions and 12 deletions
0
deploy
Normal file → Executable file
0
deploy
Normal file → Executable file
|
@ -132,9 +132,10 @@ class Teams(db.Model):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
class Problems(db.Model):
|
class Problems(db.Model):
|
||||||
pid = db.Column(db.String(128), primary_key=True, autoincrement=False)
|
pid = db.Column(db.String(32), primary_key=True, autoincrement=False)
|
||||||
title = db.Column(db.String(128))
|
title = db.Column(db.String(128))
|
||||||
category = db.Column(db.String(128))
|
category = db.Column(db.String(128))
|
||||||
|
flag = db.Column(db.String(128))
|
||||||
description = db.Column(db.Text)
|
description = db.Column(db.Text)
|
||||||
value = db.Column(db.Integer)
|
value = db.Column(db.Integer)
|
||||||
hint = db.Column(db.Text)
|
hint = db.Column(db.Text)
|
||||||
|
@ -143,11 +144,12 @@ class Problems(db.Model):
|
||||||
threshold = db.Column(db.Integer)
|
threshold = db.Column(db.Integer)
|
||||||
weightmap = db.Column(db.PickleType)
|
weightmap = db.Column(db.PickleType)
|
||||||
|
|
||||||
def __init__(self, pid, title, category, description, value, hint="", autogen=False, bonus=0, threshold=0, weightmap={}):
|
def __init__(self, pid, title, category, description, flag, value, hint="", autogen=False, bonus=0, threshold=0, weightmap={}):
|
||||||
self.pid = pid
|
self.pid = pid
|
||||||
self.title = title
|
self.title = title
|
||||||
self.category = category
|
self.category = category
|
||||||
self.description = description
|
self.description = description
|
||||||
|
self.flag = flag
|
||||||
self.value = value
|
self.value = value
|
||||||
self.hint = hint
|
self.hint = hint
|
||||||
self.autogen = autogen
|
self.autogen = autogen
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import hashlib
|
import hashlib
|
||||||
import logger
|
import logger
|
||||||
import os
|
import os
|
||||||
|
import utils
|
||||||
|
|
||||||
from flask import Blueprint, jsonify, session, request
|
from flask import Blueprint, jsonify, session, request
|
||||||
from flask import current_app as app
|
from flask import current_app as app
|
||||||
|
@ -18,14 +19,18 @@ def problem_add():
|
||||||
name = request.form["name"]
|
name = request.form["name"]
|
||||||
category = request.form["category"]
|
category = request.form["category"]
|
||||||
description = request.form["description"]
|
description = request.form["description"]
|
||||||
hint = request.form["problem-hint"]
|
hint = request.form["hint"]
|
||||||
flag = request.form["flag"]
|
flag = request.form["flag"]
|
||||||
value = request.form["value"]
|
value = request.form["value"]
|
||||||
|
pid = utils.generate_string()
|
||||||
|
while Problems.query.filter_by(pid=pid).first():
|
||||||
|
pid = utils.generate_string()
|
||||||
|
|
||||||
name_exists = Problems.query.filter_by(name=name).first()
|
name_exists = Problems.query.filter_by(title=name).first()
|
||||||
if name_exists:
|
if name_exists:
|
||||||
raise WebException("Problem name already taken.")
|
raise WebException("Problem name already taken.")
|
||||||
problem = Problems(name, category, description, hint, flag, value)
|
|
||||||
|
problem = Problems(pid, name, category, description, flag, value, hint=hint)
|
||||||
db.session.add(problem)
|
db.session.add(problem)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
@ -160,4 +165,4 @@ def get_problem(title=None, pid=None):
|
||||||
match.update({ "pid": pid })
|
match.update({ "pid": pid })
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
result = Problems.query.filter_by(**match)
|
result = Problems.query.filter_by(**match)
|
||||||
return result
|
return result
|
||||||
|
|
|
@ -99,4 +99,4 @@ def generate_identicon(email, filename):
|
||||||
draw.rectangle([(4*cell + margin, (i-10)*cell + margin), (5*cell + margin, (i-9)*cell + margin)], fill=c)
|
draw.rectangle([(4*cell + margin, (i-10)*cell + margin), (5*cell + margin, (i-9)*cell + margin)], fill=c)
|
||||||
|
|
||||||
image.save(open("pfp/%s.png" % filename, "w"), "PNG")
|
image.save(open("pfp/%s.png" % filename, "w"), "PNG")
|
||||||
return
|
return
|
||||||
|
|
|
@ -2,4 +2,26 @@ $(document).ready(function() {
|
||||||
$(".panel-title > a[data-toggle=collapse]").click(function(e) {
|
$(".panel-title > a[data-toggle=collapse]").click(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var create_problem = function() {
|
||||||
|
var input = "#new_problem_form input";
|
||||||
|
var data = $("#new_problem_form").serializeObject();
|
||||||
|
$(input).attr("disabled", "disabled");
|
||||||
|
api_call("POST", "/api/problem/add", data, function(result) {
|
||||||
|
if (result["success"] == 1) {
|
||||||
|
display_message("add-status", "success", result["message"], function() {
|
||||||
|
$(input).removeAttr("disabled");
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
display_message("add-status", "danger", result["message"], function() {
|
||||||
|
$(input).removeAttr("disabled");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(jqXHR, status, error) {
|
||||||
|
var result = jqXHR["responseText"];
|
||||||
|
display_message("add-status", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() {
|
||||||
|
$(input).removeAttr("disabled");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
@ -25,6 +25,24 @@
|
||||||
<h4 class="panel-title">New Problem</h4>
|
<h4 class="panel-title">New Problem</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
<div id="add-status"></div>
|
||||||
|
<form class="form-horizontal" onsubmit="create_problem(); return false;" id="new_problem_form">
|
||||||
|
<input class="form-control" name="name" placeholder="Name" required/>
|
||||||
|
<br>
|
||||||
|
<textarea class="form-control" name="description" placeholder="Description" required autocomplete="off"/>
|
||||||
|
<br>
|
||||||
|
<input class="form-control" name="category" placeholder="Category" required autocomplete="off"/>
|
||||||
|
<br>
|
||||||
|
<input class="form-control" name="hint" placeholder="Hint" required/>
|
||||||
|
<br>
|
||||||
|
<input class="form-control" name="value" type="number" placeholder="Problem Value" required autocomplete="off"/>
|
||||||
|
<br>
|
||||||
|
<input class="form-control" name="flag" placeholder="Flag" required/>
|
||||||
|
<br>
|
||||||
|
<div id="new_grader"></div>
|
||||||
|
<br>
|
||||||
|
<input type="submit" id="create-problem" class="btn btn-success" value="Create"/>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -43,7 +61,7 @@
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
/*$(".selectpicker").selectpicker();
|
$(".selectpicker").selectpicker();
|
||||||
var config = {
|
var config = {
|
||||||
toolbar: [
|
toolbar: [
|
||||||
{ name: "basicstyles", items: [ "Bold", "Italic", "Underline" ] },
|
{ name: "basicstyles", items: [ "Bold", "Italic", "Underline" ] },
|
||||||
|
@ -54,7 +72,7 @@
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
var editor = new EpicEditor({
|
var editor = new EpicEditor({
|
||||||
container: "description",
|
container: "new_grader",
|
||||||
theme: {
|
theme: {
|
||||||
base: "https://cdnjs.cloudflare.com/ajax/libs/epiceditor/0.2.2/themes/base/epiceditor.css",
|
base: "https://cdnjs.cloudflare.com/ajax/libs/epiceditor/0.2.2/themes/base/epiceditor.css",
|
||||||
preview: "https://cdnjs.cloudflare.com/ajax/libs/epiceditor/0.2.2/themes/preview/github.css",
|
preview: "https://cdnjs.cloudflare.com/ajax/libs/epiceditor/0.2.2/themes/preview/github.css",
|
||||||
|
@ -66,6 +84,6 @@
|
||||||
}).load();
|
}).load();
|
||||||
var new_grader = ace.edit("new_grader");
|
var new_grader = ace.edit("new_grader");
|
||||||
new_grader.setTheme("ace/theme/tomorrow");
|
new_grader.setTheme("ace/theme/tomorrow");
|
||||||
new_grader.getSession().setMode("ace/mode/python");*/
|
new_grader.getSession().setMode("ace/mode/python");
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in a new issue