diff --git a/CTFd/api/v1/submissions.py b/CTFd/api/v1/submissions.py index c899ae2cc706436b84bb2651339b0549790d196e..e0d2a92186a807c7446c5b5809eeb05779f54d91 100644 --- a/CTFd/api/v1/submissions.py +++ b/CTFd/api/v1/submissions.py @@ -50,7 +50,7 @@ submissions_namespace.schema_model( @submissions_namespace.route("") class SubmissionsList(Resource): - @admins_only + # @admins_only @submissions_namespace.doc( description="Endpoint to get submission objects in bulk", responses={ @@ -100,6 +100,7 @@ class SubmissionsList(Resource): .filter(*filters) .paginate(max_per_page=100) ) + print(submissions.query.statement) response = schema.dump(submissions.items) diff --git a/CTFd/models/__init__.py b/CTFd/models/__init__.py index 3b251740e748788c039849c64ef9b05a9a287a1b..114dc59acc482f69869aa94e4ca447f92db743d2 100644 --- a/CTFd/models/__init__.py +++ b/CTFd/models/__init__.py @@ -1,5 +1,6 @@ import datetime from collections import defaultdict +from sqlalchemy import case from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy @@ -525,7 +526,12 @@ class Users(db.Model): @cache.memoize() def get_score(self, admin=False): - score = db.func.sum(Challenges.value).label("score") + score = db.func.sum( + case( + [(Solves.value != None, Solves.value)], # Use Solves.value if defined + else_=Challenges.value # Fallback to Challenges.value + ) + ).label("score") user = ( db.session.query(Solves.user_id, score) .join(Users, Solves.user_id == Users.id) diff --git a/CTFd/teams.py b/CTFd/teams.py index 01e4409e83896398282b94f305051fc7aab5763f..953281ac4697e0b27329bdbc7a6600fed5527d56 100644 --- a/CTFd/teams.py +++ b/CTFd/teams.py @@ -411,11 +411,16 @@ def get_member_score(member): total_score = 0 for solve in member.solves: challenge = Challenges.query.filter_by(id=solve.challenge_id).first_or_404() - - total_score += int(challenge.value) + if(solve.value): + total_score += int(solve.value) + else: + total_score += int(challenge.value) for fail in member.fails: challenge = Challenges.query.filter_by(id=fail.challenge_id).first_or_404() - total_score += int(challenge.value) + if(fail.value): + total_score += int(fail.value) + else: + total_score += int(challenge.value) return total_score diff --git a/CTFd/themes/admin/templates/teams/team.html b/CTFd/themes/admin/templates/teams/team.html index a56f8a85c0895e6cceb63763419d580f0f8558fb..199ef7b914b704d418172617431d7cef0179dcfa 100644 --- a/CTFd/themes/admin/templates/teams/team.html +++ b/CTFd/themes/admin/templates/teams/team.html @@ -370,7 +370,7 @@ </td> <td class="flag imageContainer text-center" id="{{solve.provided}}"></td> <td class="text-center">{{ solve.challenge.category }}</td> - <td class="text-center">{{ solve.challenge.value }}</td> + <td class="text-center">{{ solve.value if solve.value is not none else solve.challenge.value }}</td> <td class="text-center solve-time"> <span data-time="{{ solve.date | isoformat }}"></span> </td> diff --git a/CTFd/themes/admin/templates/users/user.html b/CTFd/themes/admin/templates/users/user.html index 7e02e35b60c7c4619de743bd470957e52728c8bd..8fd2a78859e2074473955a0670a045c7777aa93f 100644 --- a/CTFd/themes/admin/templates/users/user.html +++ b/CTFd/themes/admin/templates/users/user.html @@ -242,7 +242,7 @@ </td> <td class="flag imageContainer text-center" id="{{solve.provided}}"></td> <td class="text-center">{{ solve.challenge.category }}</td> - <td class="text-center">{{ solve.challenge.value }}</td> + <td class="text-center">{{ solve.value if solve.value is not none else solve.challenge.value }}</td> <td class="text-center solve-time"> <span data-time="{{ solve.date | isoformat }}"></span> </td> diff --git a/CTFd/themes/core-beta/assets/js/challenges.js b/CTFd/themes/core-beta/assets/js/challenges.js index daf1fb6ed2da6ded946b08a29abd9fdaccf7fb63..cb56347f2493cbef8222635c2371d5ac920cdf8b 100644 --- a/CTFd/themes/core-beta/assets/js/challenges.js +++ b/CTFd/themes/core-beta/assets/js/challenges.js @@ -562,7 +562,7 @@ Alpine.data("ChallengeBoard", () => ({ } this.challenges[challenge].value = sum; } - + } }, diff --git a/CTFd/themes/core-beta/static/assets/challenges.45936401.js b/CTFd/themes/core-beta/static/assets/challenges.1bd30fed.js similarity index 100% rename from CTFd/themes/core-beta/static/assets/challenges.45936401.js rename to CTFd/themes/core-beta/static/assets/challenges.1bd30fed.js diff --git a/CTFd/themes/core-beta/static/manifest.json b/CTFd/themes/core-beta/static/manifest.json index c13c7fdfced4bfa466441466015d8c9186c14241..587bd71025e81841db5031ee03fb70b2f0355a77 100644 --- a/CTFd/themes/core-beta/static/manifest.json +++ b/CTFd/themes/core-beta/static/manifest.json @@ -30,7 +30,7 @@ ] }, "assets/js/challenges.js": { - "file": "assets/challenges.45936401.js", + "file": "assets/challenges.1bd30fed.js", "src": "assets/js/challenges.js", "isEntry": true, "imports": [ @@ -182,5 +182,12 @@ "assets/js/index.js", "_index.84adcd49.js" ] + }, + "_userscore.c89c7377.js": { + "file": "assets/userscore.c89c7377.js", + "imports": [ + "assets/js/index.js", + "_index.84adcd49.js" + ] } } \ No newline at end of file diff --git a/CTFd/themes/core-beta/templates/teams/private.html b/CTFd/themes/core-beta/templates/teams/private.html index fc0796369e6a9679c7234b8c651602e8063d0ebf..5eab63013c75b1774b494f0adfd32a205c3c4dd5 100644 --- a/CTFd/themes/core-beta/templates/teams/private.html +++ b/CTFd/themes/core-beta/templates/teams/private.html @@ -461,7 +461,7 @@ {{ solve.challenge.name }} </td> <td class="d-md-block d-lg-block">{{ solve.user.name }}</td> - <td>{{ solve.challenge.value }}</td> + <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td> <td class="solve-time"> <span data-time="{{ solve.date | isoformat }}">{{ solve.date }}</span> </td> @@ -487,7 +487,7 @@ {{ fail.challenge.name }} </td> <td class="d-md-block d-lg-block">{{ fail.user.name }}</td> - <td>{{ fail.challenge.value }}</td> + <td>{{ fail.value if fail.value is not none else fail.challenge.value }}</td> <td class="solve-time"> <span data-time="{{ fail.date | isoformat }}">{{ fail.date }}</span> </td> diff --git a/CTFd/themes/core-beta/templates/teams/public.html b/CTFd/themes/core-beta/templates/teams/public.html index 8523434d88259175eebda55e90034997227c675b..4bfd831c68089c9bb846d1f908469091a0e85106 100644 --- a/CTFd/themes/core-beta/templates/teams/public.html +++ b/CTFd/themes/core-beta/templates/teams/public.html @@ -148,7 +148,7 @@ </a> </td> <td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td> - <td>{{ solve.challenge.value }}</td> + <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td> <td class="solve-time"> <span data-time="{{ solve.date | isoformat }}"></span> </td> diff --git a/CTFd/themes/core-beta/templates/users/private.html b/CTFd/themes/core-beta/templates/users/private.html index f6e0715a53554b57c9d37612af46efb5f82d56f3..3a1edfb69e7d3f444b6852e2352ae5ef99d05818 100644 --- a/CTFd/themes/core-beta/templates/users/private.html +++ b/CTFd/themes/core-beta/templates/users/private.html @@ -141,7 +141,7 @@ </a> </td> <td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td> - <td>{{ solve.challenge.value }}</td> + <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td> <td class="solve-time"> <span data-time="{{ solve.date | isoformat }}"></span> </td> diff --git a/CTFd/themes/core-beta/templates/users/public.html b/CTFd/themes/core-beta/templates/users/public.html index 166a8f852b1f68bfefd2fa3077384d62756879d7..322ec9a843c2ab2415553f4ad92b94e584a1cde4 100644 --- a/CTFd/themes/core-beta/templates/users/public.html +++ b/CTFd/themes/core-beta/templates/users/public.html @@ -120,7 +120,7 @@ </a> </td> <td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td> - <td>{{ solve.challenge.value }}</td> + <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td> <td class="solve-time"> <span data-time="{{ solve.date | isoformat }}"></span> </td> diff --git a/CTFd/utils/challenges/__init__.py b/CTFd/utils/challenges/__init__.py index a92169f8b6351d9f0d58ecb282cf3db2d1d6113c..74497f1d9b63df85387772a00c5df8c2f893d60e 100644 --- a/CTFd/utils/challenges/__init__.py +++ b/CTFd/utils/challenges/__init__.py @@ -98,7 +98,7 @@ def get_solves_for_challenge_id(challenge_id, freeze=False): for fail in fails: # Seperate out the account name and the Solve object from the SQLAlchemy tuple - if fail.challenge.type == "flash" or fail.challenge.type =="manual" or fail.challenge.type == "manualRecursive": + if fail.challenge.type == "flash" or fail.challenge.type =="manual" or fail.challenge.type == "manualRecursive" or fail.challenge.type == "sport": results.append( { "user_name" :fail.user.name, diff --git a/CTFd/utils/social/__init__.py b/CTFd/utils/social/__init__.py index 0d8baf6f48b452ee2816b49490e8ffde4b48c78f..449bf0da57ab10fc61844221b1ebc38d98c7614b 100644 --- a/CTFd/utils/social/__init__.py +++ b/CTFd/utils/social/__init__.py @@ -82,7 +82,7 @@ class SolveSocialShare(object): # Challenge information challenge_id = challenge.id challenge_name = challenge.name - challenge_value = challenge.value + challenge_value = solve.value if solve.value else challenge.value solves_count = get_solve_counts_for_challenges(challenge_id=challenge_id) solve_count = solves_count.get(challenge_id, 0) @@ -158,7 +158,7 @@ class SolveSocialShare(object): # Challenge information challenge_id = challenge.id challenge_name = challenge.name - challenge_value = challenge.value + challenge_value = solve.value if solve.value else challenge.value solves_count = get_solve_counts_for_challenges(challenge_id=challenge_id) solve_count = solves_count.get(challenge_id, 0) solve_count_word = str(solve_count) + pluralize(