diff --git a/admin/api/settings.go b/admin/api/settings.go
new file mode 100644
index 00000000..9a7bc638
--- /dev/null
+++ b/admin/api/settings.go
@@ -0,0 +1,34 @@
+package api
+
+import (
+ "encoding/json"
+ "path"
+
+ "srs.epita.fr/fic-server/settings"
+
+ "github.com/julienschmidt/httprouter"
+)
+
+var TeamsDir string
+
+func init() {
+ router.GET("/api/settings.json", apiHandler(getSettings))
+ router.PUT("/api/settings.json", apiHandler(saveSettings))
+}
+
+func getSettings(_ httprouter.Params, body []byte) (interface{}, error) {
+ return settings.ReadSettings(path.Join(TeamsDir, settings.SettingsFile))
+}
+
+func saveSettings(_ httprouter.Params, body []byte) (interface{}, error) {
+ var config settings.FICSettings
+ if err := json.Unmarshal(body, &config); err != nil {
+ return nil, err
+ }
+
+ if err := settings.SaveSettings(path.Join(TeamsDir, settings.SettingsFile), config); err != nil {
+ return nil, err
+ } else {
+ return config, err
+ }
+}
diff --git a/admin/index.go b/admin/index.go
index 4e097ed1..a7b2b457 100644
--- a/admin/index.go
+++ b/admin/index.go
@@ -24,6 +24,7 @@ const indextpl = `
Thèmes
Exercices
Événements
+ Paramètres
diff --git a/admin/main.go b/admin/main.go
index 2bedfb6e..ac4bdafc 100644
--- a/admin/main.go
+++ b/admin/main.go
@@ -25,6 +25,7 @@ func main() {
flag.StringVar(&SubmissionDir, "submission", "./submissions/", "Base directory where save submissions")
flag.StringVar(&PKIDir, "pki", "./pki/", "Base directory where found PKI scripts")
flag.StringVar(&StaticDir, "static", "./htdocs-admin/", "Directory containing static files")
+ flag.StringVar(&api.TeamsDir, "teams", "./TEAMS", "Base directory where save teams JSON files")
flag.StringVar(&fic.FilesDir, "files", "./FILES/", "Base directory where found challenges files, local part")
flag.StringVar(&api.CloudDAVBase, "clouddav", "https://srs.epita.fr/owncloud/remote.php/webdav/FIC 2016",
"Base directory where found challenges files, cloud part")
diff --git a/admin/static.go b/admin/static.go
index 10fe5417..ba2bebf5 100644
--- a/admin/static.go
+++ b/admin/static.go
@@ -19,6 +19,9 @@ func init() {
api.Router().GET("/events/*_", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
http.ServeFile(w, r, path.Join(StaticDir, "index.html"))
})
+ api.Router().GET("/settings/*_", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
+ http.ServeFile(w, r, path.Join(StaticDir, "index.html"))
+ })
api.Router().GET("/teams/*_", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
http.ServeFile(w, r, path.Join(StaticDir, "index.html"))
})
diff --git a/admin/static/index.html b/admin/static/index.html
index 9b1e4683..39e91f33 100644
--- a/admin/static/index.html
+++ b/admin/static/index.html
@@ -22,6 +22,7 @@
Thèmes
Exercices
Événements
+ Paramètres
diff --git a/admin/static/js/app.js b/admin/static/js/app.js
index cca456cb..304b4b58 100644
--- a/admin/static/js/app.js
+++ b/admin/static/js/app.js
@@ -13,6 +13,10 @@ angular.module("FICApp", ["ngRoute", "ngResource", "ngSanitize"])
controller: "ExerciceController",
templateUrl: "views/exercice.html"
})
+ .when("/settings", {
+ controller: "SettingsController",
+ templateUrl: "views/settings.html"
+ })
.when("/exercices", {
controller: "AllExercicesListController",
templateUrl: "views/exercice-list.html"
@@ -56,6 +60,11 @@ angular.module("FICApp")
'update': {method: 'PUT'},
})
})
+ .factory("Settings", function($resource) {
+ return $resource("/api/settings.json", null, {
+ 'update': {method: 'PUT'},
+ })
+ })
.factory("Team", function($resource) {
return $resource("/api/teams/:teamId", { teamId: '@id' }, {
'update': {method: 'PUT'},
@@ -186,10 +195,39 @@ angular.module("FICApp")
};
})
+ .directive('float', function() {
+ return {
+ require: 'ngModel',
+ link: function(scope, ele, attr, ctrl){
+ ctrl.$parsers.unshift(function(viewValue){
+ return parseFloat(viewValue, 10);
+ });
+ }
+ };
+ })
+
.controller("VersionController", function($scope, Version) {
$scope.v = Version.get();
})
+ .controller("SettingsController", function($scope, Settings, $location, $http) {
+ $scope.config = Settings.get();
+ $scope.duration = 240;
+
+ $scope.saveSettings = function() {
+ this.config.$update(function() {
+ $location.url("/");
+ });
+ }
+ $scope.launchChallenge = function() {
+ var ts = Date.now() - Date.now() % 60000;
+ var d = new Date(ts + 120000);
+ this.config.start = d.toISOString();
+ var f = new Date(ts + 120000 + this.duration * 60000);
+ this.config.end = f.toISOString();
+ }
+ })
+
.controller("EventsListController", function($scope, Event, $location) {
$scope.events = Event.query();
$scope.fields = ["id", "kind", "txt", "time"];
diff --git a/admin/static/views/settings.html b/admin/static/views/settings.html
new file mode 100644
index 00000000..fe15a1dc
--- /dev/null
+++ b/admin/static/views/settings.html
@@ -0,0 +1,102 @@
+
Paramètres
+
+