Challenge team mode improvements (#1013)

* Sort solves in admin challenge view by date
* Link to appropriate user and challenge in team, user, and challenge pages
selenium-screenshot-testing
Kevin Chung 2019-06-03 22:41:45 -04:00 committed by GitHub
parent 458ce2e518
commit 4983adf78a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 68 additions and 24 deletions

View File

@ -22,7 +22,11 @@ def challenges_detail(challenge_id):
Challenges.query.with_entities(Challenges.id, Challenges.name).all() Challenges.query.with_entities(Challenges.id, Challenges.name).all()
) )
challenge = Challenges.query.filter_by(id=challenge_id).first_or_404() challenge = Challenges.query.filter_by(id=challenge_id).first_or_404()
solves = Solves.query.filter_by(challenge_id=challenge.id).all() solves = (
Solves.query.filter_by(challenge_id=challenge.id)
.order_by(Solves.date.asc())
.all()
)
flags = Flags.query.filter_by(challenge_id=challenge.id).all() flags = Flags.query.filter_by(challenge_id=challenge.id).all()
challenge_class = get_chal_class(challenge.type) challenge_class = get_chal_class(challenge.type)

View File

@ -90,12 +90,9 @@ def teams_detail(team_id):
missing = Challenges.query.filter(not_(Challenges.id.in_(solve_ids))).all() missing = Challenges.query.filter(not_(Challenges.id.in_(solve_ids))).all()
# Get addresses for all members # Get addresses for all members
last_seen = db.func.max(Tracking.date).label("last_seen")
addrs = ( addrs = (
db.session.query(Tracking.ip, last_seen) Tracking.query.filter(Tracking.user_id.in_(member_ids))
.filter(Tracking.user_id.in_(member_ids)) .order_by(Tracking.date.desc())
.group_by(Tracking.ip)
.order_by(last_seen.desc())
.all() .all()
) )

View File

@ -93,13 +93,8 @@ def users_detail(user_id):
missing = Challenges.query.filter(not_(Challenges.id.in_(solve_ids))).all() missing = Challenges.query.filter(not_(Challenges.id.in_(solve_ids))).all()
# Get IP addresses that the User has used # Get IP addresses that the User has used
last_seen = db.func.max(Tracking.date).label("last_seen")
addrs = ( addrs = (
db.session.query(Tracking.ip, last_seen) Tracking.query.filter_by(user_id=user_id).order_by(Tracking.date.desc()).all()
.filter_by(user_id=user_id)
.group_by(Tracking.ip)
.order_by(last_seen.desc())
.all()
) )
# Get Fails # Get Fails

View File

@ -8,8 +8,12 @@
<tbody id="challenge-solves-body"> <tbody id="challenge-solves-body">
{% if solves is defined %} {% if solves is defined %}
{% for solve in solves %} {% for solve in solves %}
<tr> <tr data-href="{{ generate_account_url(solve.account_id, admin=True) }}">
<td>{{ solve.account.name }}</td> <td>
<a href="{{ generate_account_url(solve.account_id, admin=True) }}">
{{ solve.account.name }}
</a>
</td>
<td> <td>
<script> <script>
document.write(moment("{{ solve.date | isoformat }}").local().format('MMMM Do, h:mm:ss A')) document.write(moment("{{ solve.date | isoformat }}").local().format('MMMM Do, h:mm:ss A'))

View File

@ -174,6 +174,7 @@
<thead> <thead>
<tr> <tr>
<td class="text-center"><b>Challenge</b></td> <td class="text-center"><b>Challenge</b></td>
<td class="text-center"><b>User</b></td>
<td class="text-center"><b>Submitted</b></td> <td class="text-center"><b>Submitted</b></td>
<td class="text-center"><b>Category</b></td> <td class="text-center"><b>Category</b></td>
<td class="text-center"><b>Value</b></td> <td class="text-center"><b>Value</b></td>
@ -184,7 +185,16 @@
<tbody> <tbody>
{% for solve in solves %} {% for solve in solves %}
<tr class="chal-solve"> <tr class="chal-solve">
<td class="text-center chal" id="{{ solve.challenge_id }}">{{ solve.challenge.name }}</td> <td class="text-center chal" id="{{ solve.challenge_id }}">
<a href="{{ url_for("admin.challenges_detail", challenge_id=solve.challenge_id) }}">
{{ solve.challenge.name }}
</a>
</td>
<td class="text-center">
<a href="{{ url_for("admin.users_detail", user_id=solve.user_id) }}">
{{ solve.user.name }}
</a>
</td>
<td class="flag" id="{{ solve.id }}"><pre>{{ solve.provided }}</pre></td> <td class="flag" id="{{ solve.id }}"><pre>{{ solve.provided }}</pre></td>
<td class="text-center">{{ solve.challenge.category }}</td> <td class="text-center">{{ solve.challenge.category }}</td>
<td class="text-center">{{ solve.challenge.value }}</td> <td class="text-center">{{ solve.challenge.value }}</td>
@ -215,6 +225,7 @@
<thead> <thead>
<tr> <tr>
<td class="text-center"><b>Challenge</b></td> <td class="text-center"><b>Challenge</b></td>
<td class="text-center"><b>User</b></td>
<td class="text-center"><b>Submitted</b></td> <td class="text-center"><b>Submitted</b></td>
<td class="text-center"><b>Time</b></td> <td class="text-center"><b>Time</b></td>
<td class="text-center"><b>Delete</b></td> <td class="text-center"><b>Delete</b></td>
@ -223,7 +234,16 @@
<tbody> <tbody>
{% for fail in fails %} {% for fail in fails %}
<tr class="chal-wrong"> <tr class="chal-wrong">
<td class="text-center chal" id="{{ fail.challenge_id }}">{{ fail.challenge.name }}</td> <td class="text-center chal" id="{{ fail.challenge_id }}">
<a href="{{ url_for("admin.challenges_detail", challenge_id=fail.challenge_id) }}">
{{ fail.challenge.name }}
</a>
</td>
<td class="text-center">
<a href="{{ url_for("admin.users_detail", user_id=fail.user_id) }}">
{{ fail.user.name }}
</a>
</td>
<td class="flag" id="{{ fail.id }}"><pre>{{ fail.provided }}</pre></td> <td class="flag" id="{{ fail.id }}"><pre>{{ fail.provided }}</pre></td>
<td class="text-center solve-time"> <td class="text-center solve-time">
<script>document.write(moment("{{ fail.date|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script> <script>document.write(moment("{{ fail.date|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script>
@ -252,6 +272,7 @@
<thead> <thead>
<tr> <tr>
<td class="text-center"><b>Name</b></td> <td class="text-center"><b>Name</b></td>
<td class="text-center"><b>User</b></td>
<td class="text-center"><b>Description</b></td> <td class="text-center"><b>Description</b></td>
<td class="text-center"><b>Date</b></td> <td class="text-center"><b>Date</b></td>
<td class="text-center"><b>Value</b></td> <td class="text-center"><b>Value</b></td>
@ -264,6 +285,11 @@
{% for award in awards %} {% for award in awards %}
<tr class="award-row"> <tr class="award-row">
<td class="text-center chal" id="{{ award.id }}">{{ award.name }}</td> <td class="text-center chal" id="{{ award.id }}">{{ award.name }}</td>
<td class="text-center">
<a href="{{ url_for("admin.users_detail", user_id=award.user_id) }}">
{{ award.user.name }}
</a>
</td>
<td class=""><pre>{{ award.description }}</pre></td> <td class=""><pre>{{ award.description }}</pre></td>
<td class="text-center solve-time"> <td class="text-center solve-time">
<script>document.write(moment("{{ award.date|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script> <script>document.write(moment("{{ award.date|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script>
@ -293,6 +319,7 @@
<h3 class="text-center">IP Addresses</h3> <h3 class="text-center">IP Addresses</h3>
<thead> <thead>
<tr> <tr>
<td class="text-center"><b>User</b></td>
<td class="text-center"><b>IP Address</b></td> <td class="text-center"><b>IP Address</b></td>
<td class="text-center"><b>Last Seen</b></td> <td class="text-center"><b>Last Seen</b></td>
</tr> </tr>
@ -300,9 +327,14 @@
<tbody> <tbody>
{% for addr in addrs %} {% for addr in addrs %}
<tr> <tr>
<td class="text-center">{{ addr[0] }}</td> <td class="text-center">
<a href="{{ url_for("admin.users_detail", user_id=addr.user_id) }}">
{{ addr.user.name }}
</a>
</td>
<td class="text-center">{{ addr.ip }}</td>
<td class="text-center solve-time"> <td class="text-center solve-time">
<script>document.write(moment("{{ addr[1]|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script> <script>document.write(moment("{{ addr.date|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -79,7 +79,9 @@
{% if user.team_id %} {% if user.team_id %}
<h2 id="team-acc" class="text-center"> <h2 id="team-acc" class="text-center">
<a href="{{ url_for('admin.teams_detail', team_id=user.team_id) }}">{{ user.team.name }}</a> <a href="{{ url_for('admin.teams_detail', team_id=user.team_id) }}">
{{ user.team.name }}
</a>
</h2> </h2>
{% endif %} {% endif %}
@ -169,7 +171,11 @@
<tbody> <tbody>
{% for solve in solves %} {% for solve in solves %}
<tr class="chal-solve"> <tr class="chal-solve">
<td class="text-center chal" id="{{ solve.challenge_id }}">{{ solve.challenge.name }}</td> <td class="text-center chal" id="{{ solve.challenge_id }}">
<a href="{{ url_for("admin.challenges_detail", challenge_id=solve.challenge_id) }}">
{{ solve.challenge.name }}
</a>
</td>
<td class="flag" id="{{ solve.id }}"><pre>{{ solve.provided }}</pre></td> <td class="flag" id="{{ solve.id }}"><pre>{{ solve.provided }}</pre></td>
<td class="text-center">{{ solve.challenge.category }}</td> <td class="text-center">{{ solve.challenge.category }}</td>
<td class="text-center">{{ solve.challenge.value }}</td> <td class="text-center">{{ solve.challenge.value }}</td>
@ -208,7 +214,9 @@
{% for fail in fails %} {% for fail in fails %}
<tr class="chal-wrong"> <tr class="chal-wrong">
<td class="text-center chal" id="{{ fail.challenge_id }}"> <td class="text-center chal" id="{{ fail.challenge_id }}">
{{ fail.challenge.name }} <a href="{{ url_for("admin.challenges_detail", challenge_id=fail.challenge_id) }}">
{{ fail.challenge.name }}
</a>
</td> </td>
<td class="flag" id="{{ fail.id }}"> <td class="flag" id="{{ fail.id }}">
<pre>{{ fail.provided }}</pre> <pre>{{ fail.provided }}</pre>
@ -290,7 +298,11 @@
<tbody> <tbody>
{% for challenge in missing %} {% for challenge in missing %}
<tr class="chal-solve"> <tr class="chal-solve">
<td class="text-center chal" id="{{ challenge.id }}">{{ challenge.name }}</td> <td class="text-center chal" id="{{ challenge.id }}">
<a href="{{ url_for("admin.challenges_detail", challenge_id=challenge.id) }}">
{{ challenge.name }}
</a>
</td>
<td class="text-center">{{ challenge.category }}</td> <td class="text-center">{{ challenge.category }}</td>
<td class="text-center">{{ challenge.value }}</td> <td class="text-center">{{ challenge.value }}</td>
<td class="text-center"> <td class="text-center">
@ -322,9 +334,9 @@
<tbody> <tbody>
{% for addr in addrs %} {% for addr in addrs %}
<tr> <tr>
<td class="text-center">{{ addr[0] }}</td> <td class="text-center">{{ addr.ip }}</td>
<td class="text-center solve-time"> <td class="text-center solve-time">
<script>document.write(moment("{{ addr[1]|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script> <script>document.write(moment("{{ addr.date|isoformat }}").local().format('MMMM Do, h:mm:ss A'))</script>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}