mirror of
https://github.com/aljazceru/CTFd.git
synced 2025-12-18 14:34:21 +01:00
Make team profile pages use the shared errors component (#1589)
* Fix team pages to use the core errors alert component * Closes #1585
This commit is contained in:
@@ -154,6 +154,9 @@ def new():
|
||||
@authed_only
|
||||
@require_team_mode
|
||||
def private():
|
||||
infos = get_infos()
|
||||
errors = get_errors()
|
||||
|
||||
user = get_current_user()
|
||||
if not user.team_id:
|
||||
return render_template("teams/team_enrollment.html")
|
||||
@@ -167,6 +170,9 @@ def private():
|
||||
place = team.place
|
||||
score = team.score
|
||||
|
||||
if config.is_scoreboard_frozen():
|
||||
infos.append("Scoreboard has been frozen")
|
||||
|
||||
return render_template(
|
||||
"teams/private.html",
|
||||
solves=solves,
|
||||
@@ -176,6 +182,8 @@ def private():
|
||||
score=score,
|
||||
place=place,
|
||||
score_frozen=config.is_scoreboard_frozen(),
|
||||
infos=infos,
|
||||
errors=errors,
|
||||
)
|
||||
|
||||
|
||||
@@ -184,6 +192,7 @@ def private():
|
||||
@check_score_visibility
|
||||
@require_team_mode
|
||||
def public(team_id):
|
||||
infos = get_infos()
|
||||
errors = get_errors()
|
||||
team = Teams.query.filter_by(id=team_id, banned=False, hidden=False).first_or_404()
|
||||
solves = team.get_solves()
|
||||
@@ -195,6 +204,9 @@ def public(team_id):
|
||||
if errors:
|
||||
return render_template("teams/public.html", team=team, errors=errors)
|
||||
|
||||
if config.is_scoreboard_frozen():
|
||||
infos.append("Scoreboard has been frozen")
|
||||
|
||||
return render_template(
|
||||
"teams/public.html",
|
||||
solves=solves,
|
||||
@@ -203,4 +215,6 @@ def public(team_id):
|
||||
score=score,
|
||||
place=place,
|
||||
score_frozen=config.is_scoreboard_frozen(),
|
||||
infos=infos,
|
||||
errors=errors,
|
||||
)
|
||||
|
||||
@@ -154,139 +154,126 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
{% if errors %}
|
||||
<div id='errors' class="row">
|
||||
{% for error in errors %}
|
||||
<h1>{{ error }}</h1>
|
||||
{% include "components/errors.html" %}
|
||||
|
||||
<br>
|
||||
|
||||
<div class="row min-vh-25">
|
||||
<div class="col-md-12">
|
||||
<h3>Members</h3>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><b>User Name</b></td>
|
||||
<td><b>Score</b></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for member in team.members %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
||||
{{ member.name }}
|
||||
</a>
|
||||
{% if team.captain_id == member.id %}
|
||||
<span class="badge badge-primary ml-2">Captain</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ member.score }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if solves %}
|
||||
<div class="row">
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="keys-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="categories-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br class="clearfix">
|
||||
<div class="col-md-12 d-none d-md-block d-lg-block">
|
||||
<div id="score-graph" class="w-100 d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
{% if awards %}
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Awards</h3>
|
||||
</div>
|
||||
{% for award in awards %}
|
||||
<div class="col-md-3 col-sm-6">
|
||||
<p class="text-center">
|
||||
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
||||
<br>
|
||||
<strong>{{ award.name }}</strong>
|
||||
</p>
|
||||
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
||||
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
||||
<p class="text-center">{{ award.value }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
{% if score_frozen %}
|
||||
<div class="row">
|
||||
<h1 class="text-center">Scoreboard has been frozen.</h1>
|
||||
</div>
|
||||
<br>
|
||||
{% endif %}
|
||||
|
||||
<br>
|
||||
|
||||
<div class="row min-vh-25">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Members</h3>
|
||||
<h3>Solves</h3>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><b>User Name</b></td>
|
||||
<td><b>Score</b></td>
|
||||
<td><b>Challenge</b></td>
|
||||
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
||||
<td><b>Value</b></td>
|
||||
<td><b>Time</b></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for member in team.members %}
|
||||
{% for solve in solves %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
||||
{{ member.name }}
|
||||
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
||||
{{ solve.challenge.name }}
|
||||
</a>
|
||||
{% if team.captain_id == member.id %}
|
||||
<span class="badge badge-primary ml-2">Captain</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ member.score }}</td>
|
||||
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
||||
<td>{{ solve.challenge.value }}</td>
|
||||
<td class="solve-time">
|
||||
<span data-time="{{ solve.date | isoformat }}">{{ solve.date }}</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if solves %}
|
||||
<div class="row">
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="keys-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="categories-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br class="clearfix">
|
||||
<div class="col-md-12 d-none d-md-block d-lg-block">
|
||||
<div id="score-graph" class="w-100 d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
{% if awards %}
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Awards</h3>
|
||||
</div>
|
||||
{% for award in awards %}
|
||||
<div class="col-md-3 col-sm-6">
|
||||
<p class="text-center">
|
||||
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
||||
<br>
|
||||
<strong>{{ award.name }}</strong>
|
||||
</p>
|
||||
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
||||
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
||||
<p class="text-center">{{ award.value }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<br>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Solves</h3>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><b>Challenge</b></td>
|
||||
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
||||
<td><b>Value</b></td>
|
||||
<td><b>Time</b></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for solve in solves %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
||||
{{ solve.challenge.name }}
|
||||
</a>
|
||||
</td>
|
||||
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
||||
<td>{{ solve.challenge.value }}</td>
|
||||
<td class="solve-time">
|
||||
<span data-time="{{ solve.date | isoformat }}">{{ solve.date }}</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="row min-vh-25">
|
||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||
No solves yet
|
||||
</h3>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="row min-vh-25">
|
||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||
No solves yet
|
||||
</h3>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -54,136 +54,123 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
{% if errors %}
|
||||
<div id='errors' class="row">
|
||||
{% for error in errors %}
|
||||
<h1>{{ error }}</h1>
|
||||
{% include "components/errors.html" %}
|
||||
|
||||
<br>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Members</h3>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><b>User Name</b></td>
|
||||
<td><b>Score</b></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for member in team.members %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
||||
{{ member.name }}
|
||||
</a>
|
||||
</td>
|
||||
<td>{{ member.score }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if solves %}
|
||||
<div class="row">
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="keys-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="categories-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br class="clearfix">
|
||||
<div class="col-md-12 d-none d-md-block d-lg-block">
|
||||
<div id="score-graph" class="w-100 d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
{% if awards %}
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Awards</h3>
|
||||
</div>
|
||||
{% for award in awards %}
|
||||
<div class="col-md-3 col-sm-6">
|
||||
<p class="text-center">
|
||||
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
||||
<br>
|
||||
<strong>{{ award.name }}</strong>
|
||||
</p>
|
||||
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
||||
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
||||
<p class="text-center">{{ award.value }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
{% if score_frozen %}
|
||||
<div class="row">
|
||||
<h1 class="text-center">Scoreboard has been frozen.</h1>
|
||||
</div>
|
||||
<br>
|
||||
{% endif %}
|
||||
|
||||
<br>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Members</h3>
|
||||
<h3>Solves</h3>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><b>User Name</b></td>
|
||||
<td><b>Score</b></td>
|
||||
<td><b>Challenge</b></td>
|
||||
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
||||
<td><b>Value</b></td>
|
||||
<td><b>Time</b></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for member in team.members %}
|
||||
{% for solve in solves %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('users.public', user_id=member.id) }}">
|
||||
{{ member.name }}
|
||||
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
||||
{{ solve.challenge.name }}
|
||||
</a>
|
||||
</td>
|
||||
<td>{{ member.score }}</td>
|
||||
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
||||
<td>{{ solve.challenge.value }}</td>
|
||||
<td class="solve-time">
|
||||
<span data-time="{{ solve.date | isoformat }}"></span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if solves %}
|
||||
<div class="row">
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="keys-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 d-none d-md-block d-lg-block">
|
||||
<div id="categories-pie-graph" class="d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br class="clearfix">
|
||||
<div class="col-md-12 d-none d-md-block d-lg-block">
|
||||
<div id="score-graph" class="w-100 d-flex align-items-center">
|
||||
<div class="text-center w-100">
|
||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
{% if awards %}
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Awards</h3>
|
||||
</div>
|
||||
{% for award in awards %}
|
||||
<div class="col-md-3 col-sm-6">
|
||||
<p class="text-center">
|
||||
<i class="award-icon award-{{ award.icon }} fa-2x"></i>
|
||||
<br>
|
||||
<strong>{{ award.name }}</strong>
|
||||
</p>
|
||||
{% if award.category %}<p class="text-center">{{ award.category }}</p>{% endif %}
|
||||
{% if award.description %}<p class="text-center">{{ award.description }}</p>{% endif %}
|
||||
<p class="text-center">{{ award.value }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<br>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3>Solves</h3>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><b>Challenge</b></td>
|
||||
<td class="d-none d-md-block d-lg-block"><b>Category</b></td>
|
||||
<td><b>Value</b></td>
|
||||
<td><b>Time</b></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for solve in solves %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('challenges.listing') }}#{{ solve.challenge.name }}-{{ solve.challenge.id }}">
|
||||
{{ solve.challenge.name }}
|
||||
</a>
|
||||
</td>
|
||||
<td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
|
||||
<td>{{ solve.challenge.value }}</td>
|
||||
<td class="solve-time">
|
||||
<span data-time="{{ solve.date | isoformat }}"></span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="row min-vh-25">
|
||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||
No solves yet
|
||||
</h3>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="row min-vh-25">
|
||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||
No solves yet
|
||||
</h3>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user