Rudimentary implementation of config interface

This commit is contained in:
James Wang 2016-04-16 20:01:21 -04:00
parent 5b549e0e70
commit bc6c1247e1
No known key found for this signature in database
GPG key ID: 5B80C0B3F263CD5B
9 changed files with 108 additions and 5 deletions

View file

@ -3,6 +3,7 @@ import logger
import models
import problem
import user
import settings
import stats
import team
import utils

View file

@ -3,6 +3,8 @@ from decorators import admins_only, api_wrapper
from models import db, Problems, Files
from schemas import verify_to_schema, check
import settings
import cPickle as pickle
blueprint = Blueprint("admin", __name__)
@ -28,6 +30,16 @@ def problem_data():
problems_return.sort(key=lambda prob: prob["value"])
return { "success": 1, "problems": problems_return }
@blueprint.route("/settings", methods=["GET"])
@api_wrapper
@admins_only
def settings_data():
# data = settings.get_all()
settings_return = {}
settings_return["ctf_begin"] = settings.get("ctf_begin")
settings_return["ctf_end"] = settings.get("ctf_end")
return { "success": 1, "settings": settings_return }
"""
@blueprint.route("/problems/submit", methods=["POST"])
@api_wrapper

View file

@ -211,3 +211,12 @@ class TeamInvitations(db.Model):
self.rtype = rtype
self.frid = frid
self.toid = toid
class Settings(db.Model):
sid = db.Column(db.Integer, primary_key=True)
key = db.Column(db.Text, unique=True)
value = db.Column(db.Text)
def __init__(self, key, value):
self.key = key
self.value = value

36
server/api/settings.py Normal file
View file

@ -0,0 +1,36 @@
from flask import Blueprint, request
from models import db, Settings
from decorators import admins_only, api_wrapper, WebException
blueprint = Blueprint("setting", __name__)
@blueprint.route("/update", methods=["POST"])
@admins_only
@api_wrapper
def update_setting():
for key in request.form.keys():
value = request.form[key]
set(key, value)
return { "success": 1, "message": "Success!" }
def set(key, value):
setting = Settings.query.filter_by(key=key).first()
if setting:
setting.value = value
else:
setting = Settings(key, value)
db.session.add(setting)
db.session.commit()
return setting
def get_all():
settings = {}
for setting in Settings.query.all():
settings[setting.key] = setting.value
def get(key):
setting = Settings.query.filter_by(key=key).first()
if setting:
return setting.value
return set(key, None)

View file

@ -24,7 +24,7 @@ if not os.path.exists("pfp"):
os.makedirs("pfp")
with app.app_context():
from api.models import db, Files, Teams, Problems, Solves, Users
from api.models import db, Files, Teams, Problems, Settings, Solves, Users
db.init_app(app)
db.create_all()
@ -34,6 +34,7 @@ app.secret_key = config.SECRET_KEY
app.register_blueprint(api.admin.blueprint, url_prefix="/api/admin")
app.register_blueprint(api.problem.blueprint, url_prefix="/api/problem")
app.register_blueprint(api.settings.blueprint, url_prefix="/api/settings")
app.register_blueprint(api.stats.blueprint, url_prefix="/api/stats")
app.register_blueprint(api.team.blueprint, url_prefix="/api/team")
app.register_blueprint(api.user.blueprint, url_prefix="/api/user")

View file

@ -18,9 +18,6 @@ SQLALCHEMY_TRACK_MODIFICATIONS = False
UPLOAD_FOLDER = os.path.normpath("../web/files")
GRADER_FOLDER = os.path.normpath("graders")
CTF_BEGIN = 0 # To be used later
CTF_END = 0 # To be used later
MG_HOST = ""
MG_API_KEY = ""
ADMIN_EMAIL = ""

View file

@ -68,6 +68,10 @@ app.config(function($routeProvider, $locationProvider) {
templateUrl: "pages/admin/problems.html",
controller: "adminProblemsController"
})
.when("/admin/settings", {
templateUrl: "pages/admin/settings.html",
controller: "adminSettingsController"
})
.otherwise({
templateUrl: "pages/404.html",
controller: "mainController"
@ -247,6 +251,16 @@ app.controller("adminProblemsController", ["$controller", "$scope", "$http", fun
});
}]);
app.controller("adminSettingsController", ["$controller", "$scope", "$http", function($controller, $scope, $http) {
$controller("adminController", { $scope: $scope });
api_call("GET", "/api/admin/settings", {}, function(result) {
if (result["success"] == 1) {
$scope.settings = result["settings"];
}
$scope.$apply();
});
}]);
app.controller("settingsController", ["$controller", "$scope", "$http", function($controller, $scope, $http) {
$controller("loginController", { $scope: $scope });
api_call("GET", "/api/user/info", {}, function(result) {

View file

@ -0,0 +1,33 @@
<div>
<h1>CTF Settings</h1>
<div ng-if="settings">
<div id="settings_msg"/>
<form class="form-horizontal" onsubmit="update_settings(); return false;" id="update_settings_form">
<input class="form-control" name="ctf_begin" value="{{ settings['ctf_begin'] }}"/>
<br>
<input class="form-control" name="ctf_end" value="{{ settings['ctf_end'] }}"/>
<br>
<input type="submit" class="btn btn-success" value="Update"/>
</form>
</div>
</div>
<script>
var update_settings = function() {
var input = "#update_settings_form form input";
var data = $("#update_settings_form").serializeObject();
$(input).attr("disabled", "disabled");
api_call("POST", "/api/settings/update", data, function(result) {
if (result["success"] == 1) {
display_message("settings_msg", "success", result["message"], function() {
$(input).removeAttr("disabled");
});
} else {
display_message("settings_msg", "danger", result["message"], function() {
$(input).removeAttr("disabled");
});
console.log(result["error"]);
}
});
}
</script>

View file

@ -189,4 +189,4 @@
document.getElementById("file").addEventListener("change", uploadListener, false);
};
});
</script>
</script>