diff --git a/server/api/models.py b/server/api/models.py index 5c0cb8b..5010fc0 100644 --- a/server/api/models.py +++ b/server/api/models.py @@ -51,7 +51,8 @@ class Teams(db.Model): members.append({ "username": member.username, "name": member.name, - "captain": member.uid == self.owner + "captain": member.uid == self.owner, + "type": member.utype }) return members @@ -63,7 +64,7 @@ class Teams(db.Model): else: return 0 - def place(self): + def place(self, ranked=True): score = db.func.sum(Problems.value).label("score") quickest = db.func.max(Solves.date).label("quickest") teams = db.session.query(Solves.tid).join(Teams).join(Problems).filter().group_by(Solves.tid).order_by(score.desc(), quickest).all() @@ -112,6 +113,13 @@ class Teams(db.Model): }) return result + def is_observer(self): + members = get_members() + for member in members: + if member["observer"] == True: + return True + return False + class Problems(db.Model): pid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128)) diff --git a/server/api/stats.py b/server/api/stats.py index fa52e55..1b9c88f 100644 --- a/server/api/stats.py +++ b/server/api/stats.py @@ -12,8 +12,11 @@ blueprint = Blueprint("stats", __name__) def all_teams_stats(): teams = team.get_team().all() result = [ ] + count = 0 for _team in teams: + count += 1 result.append({ + "rank": count, "teamname": _team.teamname, "tid": _team.tid, "school": _team.school, diff --git a/server/api/team.py b/server/api/team.py index 26f0e67..80b372a 100644 --- a/server/api/team.py +++ b/server/api/team.py @@ -169,6 +169,7 @@ def team_info(): in_team = False owner = False _user = None + teamdata = { } search = { } teamname = utils.flat_multi(request.args).get("teamname") if teamname: @@ -179,21 +180,22 @@ def team_info(): if "teamname_lower" not in search: search.update({ "tid": _user.tid }) in_team = True - team = get_team(**search).first() - teamdata = get_team_info(**search) - if logged_in: - in_team = teamdata["tid"] == _user.tid - owner = teamdata["captain"] == _user.uid - teamdata["in_team"] = in_team - if in_team: - teamdata["is_owner"] = owner - if owner: - teamdata["pending_invitations"] = team.get_pending_invitations() - teamdata["invitation_requests"] = team.get_invitation_requests() - else: + if bool(search) != False: + team = get_team(**search).first() + teamdata = get_team_info(**search) if logged_in: - teamdata["invited"] = team.get_pending_invitations(toid=_user.uid) is not None - teamdata["requested"] = team.get_invitation_requests(frid=_user.uid) is not None + in_team = teamdata["tid"] == _user.tid + owner = teamdata["captain"] == _user.uid + teamdata["in_team"] = in_team + if in_team: + teamdata["is_owner"] = owner + if owner: + teamdata["pending_invitations"] = team.get_pending_invitations() + teamdata["invitation_requests"] = team.get_invitation_requests() + else: + if logged_in: + teamdata["invited"] = team.get_pending_invitations(toid=_user.uid) is not None + teamdata["requested"] = team.get_invitation_requests(frid=_user.uid) is not None return { "success": 1, "team": teamdata } ################## diff --git a/web/js/easyctf.js b/web/js/easyctf.js index ea35dd5..c9b91e9 100644 --- a/web/js/easyctf.js +++ b/web/js/easyctf.js @@ -149,15 +149,15 @@ app.controller("scoreboardController", ["$controller", "$scope", "$http", functi app.controller("resetController", ["$controller", "$scope", "$http", "$routeParams", function($controller, $scope, $http, $routeParams) { var data = { }; - $scope.token = false; - data["csrf_token"] = $.cookie("csrf_token"); + $scope.token = false; + data["csrf_token"] = $.cookie("csrf_token"); if ("token" in $routeParams) { - $scope.token = true; + $scope.token = true; token = $routeParams["token"]; $.get("/api/user/forgot/" + token, data, function(data) { - $scope.body = data["message"]; - $scope.success = data["success"] - $scope.$apply(); + $scope.body = data["message"]; + $scope.success = data["success"] + $scope.$apply(); }); } else { $controller("mainController", { $scope: $scope }); @@ -237,59 +237,59 @@ var register_form = function() { location.href = "/profile"; } else { display_message("register_msg", "danger", result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); } - }).fail(function(jqXHR, status, error) { + }, function(jqXHR, status, error) { var result = JSON.parse(jqXHR["responseText"]); display_message("register_msg", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); }); }; // password reset var request_reset_form = function() { - var data = $("#request_reset_form").serializeObject(); - $(input).attr("disabled", "disabled"); - api_call("POST", "/api/user/forgot", data, function(result) { - if (result["success"] == 1) { - display_message("reset_msg", "success", result["message"]); - } else { - display_message("reset_msg", "danger", result["message"], function() { - $(input).removeAttr("disabled"); - }); - } - }).fail(function(jqXHR, status, error) { + var data = $("#request_reset_form").serializeObject(); + $(input).attr("disabled", "disabled"); + api_call("POST", "/api/user/forgot", data, function(result) { + if (result["success"] == 1) { + display_message("reset_msg", "success", result["message"]); + } else { + display_message("reset_msg", "danger", result["message"], function() { + $(input).removeAttr("disabled"); + }); + } + }, function(jqXHR, status, error) { var result = JSON.parse(jqXHR["responseText"]); display_message("reset_msg", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); - }); + }); } var reset_form = function() { - var data = $("#reset_form").serializeObject(); - data["csrf_token"] = $.cookie("csrf_token"); - var url = window.location.href; - var token = url.substr(url.lastIndexOf("/")+1); - $(input).attr("disabled", "disabled"); - api_call("POST", "/api/user/forgot/" + token, data, function(result) { - if (result["success"] == 1) { - display_message("reset_msg", "success", result["message"], function() { - location.href = "/login"; - }); - } else { - display_message("reset_msg", "danger", result["message"], function() { - $(input).removeAttr("disabled"); - }); - } - }).fail(function(jqXHR, status, error) { + var data = $("#reset_form").serializeObject(); + data["csrf_token"] = $.cookie("csrf_token"); + var url = window.location.href; + var token = url.substr(url.lastIndexOf("/")+1); + $(input).attr("disabled", "disabled"); + api_call("POST", "/api/user/forgot/" + token, data, function(result) { + if (result["success"] == 1) { + display_message("reset_msg", "success", result["message"], function() { + location.href = "/login"; + }); + } else { + display_message("reset_msg", "danger", result["message"], function() { + $(input).removeAttr("disabled"); + }); + } + }, function(jqXHR, status, error) { var result = JSON.parse(jqXHR["responseText"]); display_message("reset_msg", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); - }); + }); } // login page @@ -303,13 +303,13 @@ var login_form = function() { location.href = "/profile"; } else { display_message("login_msg", "danger", result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); } - }).fail(function(jqXHR, status, error) { + }, function(jqXHR, status, error) { var result = JSON.parse(jqXHR["responseText"]); display_message("login_msg", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); }); }; @@ -325,13 +325,13 @@ var create_team = function() { location.reload(true); } else { display_message("create_team_msg", "danger", result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); } - }).fail(function(jqXHR, status, error) { + }, function(jqXHR, status, error) { var result = JSON.parse(jqXHR["responseText"]); display_message("create_team_msg", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); }); }; @@ -344,12 +344,12 @@ var add_member = function() { if (result["success"] == 1) { location.reload(true); } else { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); } - }).fail(function(jqXHR, status, error) { + }, function(jqXHR, status, error) { var result = JSON.parse(jqXHR["responseText"]); display_message("create_team_msg", "danger", "Error " + jqXHR["status"] + ": " + result["message"], function() { - $(input).removeAttr("disabled"); + $(input).removeAttr("disabled"); }); }); }; diff --git a/web/pages/scoreboard.html b/web/pages/scoreboard.html index ef815bc..2299e67 100644 --- a/web/pages/scoreboard.html +++ b/web/pages/scoreboard.html @@ -13,7 +13,7 @@ - + {{ team['rank'] }} {{ team['teamname'] }} {{ team['school'] }} {{ team['points'] }}