From 9557d975983705499760daa6dbfd4366f375ec31 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Mon, 21 Aug 2023 02:12:35 +0500 Subject: [PATCH 1/6] remaining submissions count added in submissions tab --- src/apps/api/serializers/competitions.py | 31 +++++- src/static/riot/competitions/detail/_tabs.tag | 1 + .../competitions/detail/submission_limit.tag | 101 ++++++++++++++++++ 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/static/riot/competitions/detail/submission_limit.tag diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index d29ca7ba7..70c54b42d 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -17,6 +17,7 @@ from api.serializers.queues import QueueSerializer from datetime import datetime +from django.utils.timezone import now class PhaseSerializer(WritableNestedModelSerializer): @@ -92,9 +93,10 @@ def validate_leaderboard(self, value): class PhaseDetailSerializer(serializers.ModelSerializer): tasks = PhaseTaskInstanceSerializer(source='task_instances', many=True) status = serializers.SerializerMethodField() - public_data = DataDetailSerializer(read_only=True) starting_kit = DataDetailSerializer(read_only=True) + remaining_submissions_per_day = serializers.SerializerMethodField() + remaining_submissions_per_person = serializers.SerializerMethodField() class Meta: model = Phase @@ -117,6 +119,9 @@ class Meta: 'public_data', 'starting_kit', 'is_final_phase', + 'remaining_submissions_per_day', + 'remaining_submissions_per_person' + ) def get_status(self, obj): @@ -155,6 +160,30 @@ def get_status(self, obj): elif not phase_started: return Phase.NEXT + def get_remaining_submissions_per_day(self, obj): + + # Get loggedin user + user = self.context['request'].user + + # Get all submissions which are not failed and belongs to this user for this phase + qs = obj.submissions.filter(owner=user, parent__isnull=True).exclude(status='Failed') + + # Count submissions made today + daily_submission_count = qs.filter(created_when__day=now().day).count() + + return daily_submission_count + + def get_remaining_submissions_per_person(self, obj): + + # Get loggedin user + user = self.context['request'].user + # Get all submissions which are not failed and belongs to this user for this phase + qs = obj.submissions.filter(owner=user, parent__isnull=True).exclude(status='Failed') + + # Count all submissions + total_submission_count = qs.count() + return total_submission_count + class PhaseUpdateSerializer(PhaseSerializer): tasks = PhaseTaskInstanceSerializer(source='task_instances', many=True) diff --git a/src/static/riot/competitions/detail/_tabs.tag b/src/static/riot/competitions/detail/_tabs.tag index 09647588c..71d7380f9 100644 --- a/src/static/riot/competitions/detail/_tabs.tag +++ b/src/static/riot/competitions/detail/_tabs.tag @@ -128,6 +128,7 @@
+
diff --git a/src/static/riot/competitions/detail/submission_limit.tag b/src/static/riot/competitions/detail/submission_limit.tag new file mode 100644 index 000000000..52385b089 --- /dev/null +++ b/src/static/riot/competitions/detail/submission_limit.tag @@ -0,0 +1,101 @@ + +
+
+
+ Number of submissions left for the day +
+ + {selected_phase.remaining_submissions_per_day} out of {selected_phase.max_submissions_per_day} + +
+
+
+ Number of total submissions left +
+ + {selected_phase.remaining_submissions_per_person} out of {selected_phase.max_submissions_per_person} + +
+
+ + + +
\ No newline at end of file From cda23533f436552ad311ff6e685bf62be9443d34 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Mon, 21 Aug 2023 02:18:00 +0500 Subject: [PATCH 2/6] white space removed --- src/apps/api/serializers/competitions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index 70c54b42d..4bef9414a 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -180,7 +180,7 @@ def get_remaining_submissions_per_person(self, obj): # Get all submissions which are not failed and belongs to this user for this phase qs = obj.submissions.filter(owner=user, parent__isnull=True).exclude(status='Failed') - # Count all submissions + # Count all submissions total_submission_count = qs.count() return total_submission_count From 559da91f1a63c4c0d9676753662259e4c86908d6 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Mon, 21 Aug 2023 02:26:52 +0500 Subject: [PATCH 3/6] style updated, comment fixed --- .../competitions/detail/submission_limit.tag | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/src/static/riot/competitions/detail/submission_limit.tag b/src/static/riot/competitions/detail/submission_limit.tag index 52385b089..367baebf3 100644 --- a/src/static/riot/competitions/detail/submission_limit.tag +++ b/src/static/riot/competitions/detail/submission_limit.tag @@ -23,7 +23,7 @@ self.badgeColor = function(remaining, max) { - // Calculate the percentage of remaining submissions + // Calculate the percentage of used submissions var percentage = (remaining / max) * 100; // Determine the badge color based on the percentage @@ -70,32 +70,25 @@ text-align center display inline-block width max-content - margin 0 auto /* Center badge horizontally */ + margin 0 auto margin-top 0.5em + border-radius 5px - .badge-green { - background-color: #a5d6a7; /* Light green */ - border-radius: 5px; - } + .badge-green + background-color #a5d6a7 + + .badge-yellow + background-color #fff59d - .badge-yellow { - background-color: #fff59d; /* Light yellow */ - border-radius: 5px; - } + .badge-orange + background-color #ffcc80 - .badge-orange { - background-color: #ffcc80; /* Light orange */ - border-radius: 5px; - } + .badge-pink + background-color #ff80ab - .badge-red { - background-color: #e57373; /* Light red */ - border-radius: 5px; - } + .badge-red + background-color #e57373 - .badge-pink { - background-color: #ff80ab; /* Light pink */ - border-radius: 5px; - } + - \ No newline at end of file + From c43a23d3ef98c14f2373eb587aeb1cf46c740d54 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Mon, 21 Aug 2023 03:02:58 +0500 Subject: [PATCH 4/6] check request in context and check if user is authenticated --- src/apps/api/serializers/competitions.py | 40 +++++++++++++----------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index 4bef9414a..e58d32e13 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -162,27 +162,31 @@ def get_status(self, obj): def get_remaining_submissions_per_day(self, obj): - # Get loggedin user - user = self.context['request'].user - - # Get all submissions which are not failed and belongs to this user for this phase - qs = obj.submissions.filter(owner=user, parent__isnull=True).exclude(status='Failed') - - # Count submissions made today - daily_submission_count = qs.filter(created_when__day=now().day).count() - - return daily_submission_count + # Check if 'request' key exists in the context + if 'request' in self.context: + # Get user from the request + user = self.context['request'].user + if user.is_authenticated: + # Get all submissions which are not failed and belongs to this user for this phase + qs = obj.submissions.filter(owner=user, parent__isnull=True).exclude(status='Failed') + # Count submissions made today + daily_submission_count = qs.filter(created_when__day=now().day).count() + return daily_submission_count + return 0 def get_remaining_submissions_per_person(self, obj): - # Get loggedin user - user = self.context['request'].user - # Get all submissions which are not failed and belongs to this user for this phase - qs = obj.submissions.filter(owner=user, parent__isnull=True).exclude(status='Failed') - - # Count all submissions - total_submission_count = qs.count() - return total_submission_count + # Check if 'request' key exists in the context + if 'request' in self.context: + # Get user from the request + user = self.context['request'].user + if user.is_authenticated: + # Get all submissions which are not failed and belongs to this user for this phase + qs = obj.submissions.filter(owner=user, parent__isnull=True).exclude(status='Failed') + # Count all submissions + total_submission_count = qs.count() + return total_submission_count + return 0 class PhaseUpdateSerializer(PhaseSerializer): From a835d98f8e00df266138f6dc994f5a89d81af767 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Mon, 21 Aug 2023 03:25:56 +0500 Subject: [PATCH 5/6] left replaced by used --- src/static/riot/competitions/detail/submission_limit.tag | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/riot/competitions/detail/submission_limit.tag b/src/static/riot/competitions/detail/submission_limit.tag index 367baebf3..d5e6d0e88 100644 --- a/src/static/riot/competitions/detail/submission_limit.tag +++ b/src/static/riot/competitions/detail/submission_limit.tag @@ -2,7 +2,7 @@
- Number of submissions left for the day + Number of submissions used for the day
{selected_phase.remaining_submissions_per_day} out of {selected_phase.max_submissions_per_day} @@ -10,7 +10,7 @@
- Number of total submissions left + Number of total submissions used
{selected_phase.remaining_submissions_per_person} out of {selected_phase.max_submissions_per_person} From 8fca9303bbc59aedf19fb380b500ebfd84cafce3 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Mon, 21 Aug 2023 12:45:08 +0500 Subject: [PATCH 6/6] remaining replace by used --- src/apps/api/serializers/competitions.py | 12 ++++++------ .../riot/competitions/detail/submission_limit.tag | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index e58d32e13..81e233523 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -95,8 +95,8 @@ class PhaseDetailSerializer(serializers.ModelSerializer): status = serializers.SerializerMethodField() public_data = DataDetailSerializer(read_only=True) starting_kit = DataDetailSerializer(read_only=True) - remaining_submissions_per_day = serializers.SerializerMethodField() - remaining_submissions_per_person = serializers.SerializerMethodField() + used_submissions_per_day = serializers.SerializerMethodField() + used_submissions_per_person = serializers.SerializerMethodField() class Meta: model = Phase @@ -119,8 +119,8 @@ class Meta: 'public_data', 'starting_kit', 'is_final_phase', - 'remaining_submissions_per_day', - 'remaining_submissions_per_person' + 'used_submissions_per_day', + 'used_submissions_per_person' ) @@ -160,7 +160,7 @@ def get_status(self, obj): elif not phase_started: return Phase.NEXT - def get_remaining_submissions_per_day(self, obj): + def get_used_submissions_per_day(self, obj): # Check if 'request' key exists in the context if 'request' in self.context: @@ -174,7 +174,7 @@ def get_remaining_submissions_per_day(self, obj): return daily_submission_count return 0 - def get_remaining_submissions_per_person(self, obj): + def get_used_submissions_per_person(self, obj): # Check if 'request' key exists in the context if 'request' in self.context: diff --git a/src/static/riot/competitions/detail/submission_limit.tag b/src/static/riot/competitions/detail/submission_limit.tag index d5e6d0e88..b8cc7dbe0 100644 --- a/src/static/riot/competitions/detail/submission_limit.tag +++ b/src/static/riot/competitions/detail/submission_limit.tag @@ -4,16 +4,16 @@
Number of submissions used for the day
- - {selected_phase.remaining_submissions_per_day} out of {selected_phase.max_submissions_per_day} + + {selected_phase.used_submissions_per_day} out of {selected_phase.max_submissions_per_day}
Number of total submissions used
- - {selected_phase.remaining_submissions_per_person} out of {selected_phase.max_submissions_per_person} + + {selected_phase.used_submissions_per_person} out of {selected_phase.max_submissions_per_person}
@@ -21,10 +21,10 @@ var self = this; self.selected_phase = {} - self.badgeColor = function(remaining, max) { + self.badgeColor = function(used, max) { // Calculate the percentage of used submissions - var percentage = (remaining / max) * 100; + var percentage = (used / max) * 100; // Determine the badge color based on the percentage if (percentage < 5) {