From e6e0310d1e0548cd1a13ba7eee5505780705d91e Mon Sep 17 00:00:00 2001 From: AtmegaBuzz Date: Tue, 23 Aug 2022 12:21:36 +0530 Subject: [PATCH 1/2] each month leaderboard --- bugheist/urls.py | 2 + website/templates/leaderboard_eachmonth.html | 88 ++++++++++++++++++++ website/views.py | 53 +++++++++--- 3 files changed, 133 insertions(+), 10 deletions(-) create mode 100644 website/templates/leaderboard_eachmonth.html diff --git a/bugheist/urls.py b/bugheist/urls.py index 9fb8ca8125..6c9cf42353 100644 --- a/bugheist/urls.py +++ b/bugheist/urls.py @@ -16,6 +16,7 @@ import comments.views import website.views from website.views import ( + EachmonthLeaderboardView, UserProfileDetailView, IssueCreate, UploadCreate, @@ -279,6 +280,7 @@ re_path(r"^label_activity/$", SpecificIssuesView.as_view(), name="all_activity"), re_path(r"^leaderboard/$", LeaderboardView.as_view(), name="leaderboard"), re_path(r"^leaderboard/monthly/$", MonthlyLeaderboardView.as_view(), name="leaderboard_monthly"), + re_path(r"^leaderboard/each-month/$", EachmonthLeaderboardView.as_view(), name="leaderboard_eachmonth"), re_path(r"^leaderboard/api/$", LeaderboardApiViewSet.as_view(), name="leaderboard_api"), re_path(r"^api/v1/issue/like/(?P\w+)/$", LikeIssueApiView.as_view(), name="like_issue"), re_path(r"^api/v1/issue/flag/(?P\w+)/$", FlagIssueApiView.as_view(), name="flag_issue"), diff --git a/website/templates/leaderboard_eachmonth.html b/website/templates/leaderboard_eachmonth.html new file mode 100644 index 0000000000..d045ab3f0f --- /dev/null +++ b/website/templates/leaderboard_eachmonth.html @@ -0,0 +1,88 @@ +{% extends "base.html" %} +{% load gravatar %} + +{% block style %} + +{% endblock %} + +{% block content %} +
+
+

Monthly Leaderboard

+
+
+
+
+
+ {%if not leaderboard%} +

No data for this month

+ {% else %} + {% for month in leaderboard %} +
+ +
+
+ {% if not month.user %} +

no bugs found this month

+ {% else %} + {% if month.user.userprofile.avatar %} + + {% elif user.socialaccount_set.all.0.get_avatar_url %} + + {% else %} + + {% endif %} + {{ month.user.username }} + {{ month.user.total_score }} Points + {% if month.user.userprofile.winnings %} + ${{ month.user.userprofile.winnings|default:""|floatformat }} + {% endif %} + + {{ month.user.userprofile.get_title_display }} {% endif %} +
+ {% endfor %} + {%endif%} +
+
+
+{% endblock %} diff --git a/website/views.py b/website/views.py index ca81203837..2e71e331bc 100644 --- a/website/views.py +++ b/website/views.py @@ -1165,7 +1165,13 @@ def curr_month_leaderboard(self): points__created__year=datetime.now().year ) ) + + + def month_leaderboard(self,month,year,api=True): + ''' + return: list of dict of current/specified month users leaderboard + ''' data = ( User.objects .annotate(total_score=Sum('points__score')) @@ -1181,7 +1187,7 @@ def month_leaderboard(self,month,year,api=True): return data - def monthly_leaderboard(self,year) -> list: + def monthly_leaderboard(self,year,api=False) -> list: ''' return: list of dict of monthly winners ordered from 1-12 for queried year @@ -1191,7 +1197,7 @@ def monthly_leaderboard(self,year) -> list: # iterating over months 1-12 for month in range(1,13): - month_winner = self.month_leaderboard(month,year) + month_winner = self.month_leaderboard(month,year,api) monthly_winner.append(month_winner) @@ -1206,17 +1212,44 @@ def get_context_data(self, *args, **kwargs): if self.request.user.is_authenticated: context["wallet"] = Wallet.objects.get(user=self.request.user) - context["leaderboard"] = ( - User.objects - .annotate(total_score=Sum('points__score')) - .order_by('-total_score') - .filter( - total_score__gt=0, - ) - ) + context["leaderboard"] = self.monthly_leaderboard() return context +class EachmonthLeaderboardView(LeaderboardView,ListView): + model = User + template_name = "leaderboard_eachmonth.html" + + def get_context_data(self, *args, **kwargs): + + context = super(LeaderboardView, self).get_context_data(*args, **kwargs) + + if self.request.user.is_authenticated: + context["wallet"] = Wallet.objects.get(user=self.request.user) + + year = self.request.GET.get("year") + + if not year: year = datetime.now().year + + if isinstance(year,str) and not year.isdigit(): + raise Http404(f"Invalid query passed | Year:{year}") + + year = int(year) + + leaderboard = self.monthly_leaderboard(year) + month_winners = [] + + months = ["January","February","March","April","May","June","July","August","September","October","Novermber","December"] + + for indx,month in enumerate(leaderboard): + + month = {"user":month.first(),"month":months[indx]} + month_winners.append(month) + + context["leaderboard"] = month_winners + + return context + class MonthlyLeaderboardView(LeaderboardView,ListView): model = User template_name = "leaderboard_monthly.html" From 387ed1bb1a1c47138aba38da43153e4ea7113fab Mon Sep 17 00:00:00 2001 From: AtmegaBuzz Date: Tue, 23 Aug 2022 12:33:11 +0530 Subject: [PATCH 2/2] minor fix --- website/templates/leaderboard_eachmonth.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/templates/leaderboard_eachmonth.html b/website/templates/leaderboard_eachmonth.html index d045ab3f0f..96c249b6de 100644 --- a/website/templates/leaderboard_eachmonth.html +++ b/website/templates/leaderboard_eachmonth.html @@ -66,7 +66,7 @@

Monthly Leaderboard

{% else %} {% if month.user.userprofile.avatar %} - {% elif user.socialaccount_set.all.0.get_avatar_url %} + {% elif month.user.socialaccount_set.all.0.get_avatar_url %} {% else %}