You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

132 lines
4.7 KiB

# import calendar
# from django.utils import timezone
# from ajaxdatatable.admin import AjaxDatatable
# from django.contrib import admin
# from django.utils.translation import gettext_lazy as _
# from django.contrib.admin import SimpleListFilter
# from django.db.models.functions import Rank, Coalesce
# from django.db.models import Sum, F, Window, CharField
# from django.utils.html import format_html
# from apps.quiz.models import Quiz, QuizRankUser, Participant, QuizCategory
# from apps.account.models import User
# class QuizFilter(SimpleListFilter):
# title = _('Quiz')
# parameter_name = 'quiz'
# def lookups(self, request, model_admin):
# quizzes = Quiz.objects.all()
# return [(quiz.id, quiz.video.title) for quiz in quizzes]
# def queryset(self, request, queryset):
# if self.value():
# return queryset.filter(uquizzes__quiz__id=self.value())
# return queryset
# class QuizCategoryFilter(SimpleListFilter):
# title = _('Quiz Category')
# parameter_name = 'quiz_category'
# def lookups(self, request, model_admin):
# categories = QuizCategory.objects.all()
# return [(category.id, category.name) for category in categories]
# def queryset(self, request, queryset):
# if self.value():
# return queryset.filter(uquizzes__quiz__category__id=self.value())
# return queryset
# class MonthFilter(SimpleListFilter):
# title = _('Month')
# parameter_name = 'month'
# def lookups(self, request, model_admin):
# return [(str(i), calendar.month_name[i]) for i in range(1, 13)]
# def queryset(self, request, queryset):
# if self.value():
# month = int(self.value())
# year = timezone.now().year
# return queryset.filter(uquizzes__started_at__year=year, uquizzes__started_at__month=month)
# return queryset
# @admin.register(QuizRankUser)
# class QuizRankUserAdmin(AjaxDatatable):
# list_display = ('username_link', 'get_total_score', 'get_rank')
# list_filter = (QuizFilter, QuizCategoryFilter, MonthFilter)
# readonly_fields = ('date_joined', 'last_login')
# def get_queryset(self, request):
# queryset = super().get_queryset(request)
# quiz_id = request.GET.get('quiz')
# category_id = request.GET.get('quiz_category')
# month = request.GET.get('month')
# filters = {}
# if quiz_id:
# filters['uquizzes__quiz_id'] = quiz_id
# if category_id:
# filters['uquizzes__quiz__category_id'] = category_id
# if month:
# month = int(month)
# year = timezone.now().year
# filters['uquizzes__started_at__year'] = year
# filters['uquizzes__started_at__month'] = month
# if filters:
# queryset = queryset.filter(**filters)
# users_scores = Participant.objects.filter(**{k.replace('uquizzes__', ''): v for k, v in filters.items()}).select_related('user').values(
# username=Coalesce(F('user__username'), F('user__email'), output_field=CharField())
# ).annotate(
# score=Sum('total_score')
# ).order_by('-score')
# # Add rank to each user using window function
# users_scores = users_scores.annotate(
# rank=Window(
# expression=Rank(),
# order_by=F('score').desc()
# )
# ).order_by("rank")
# user_scores_dict = {user['username']: user for user in users_scores}
# for user in queryset:
# user.score = user_scores_dict.get(user.username, {}).get('score', 0)
# user.rank = user_scores_dict.get(user.username, {}).get('rank', 'N/A')
# self.queryset = queryset
# return queryset
# def has_view_permission(self, request, obj=None):
# return True
# def has_change_permission(self, request, obj=None):
# return False
# def has_add_permission(self, request):
# return False
# def has_delete_permission(self, request, obj=None):
# return False
# def username_link(self, obj):
# return format_html('<a href="/en/admin/account/clientuser/{}/change/">{}</a>', obj.id, obj.username)
# username_link.short_description = 'Username'
# username_link.admin_order_field = 'username'
# def get_total_score(self, obj):
# for user in self.queryset:
# if user.id == obj.id:
# return user.score
# get_total_score.short_description = 'Total Score'
# def get_rank(self, obj):
# for user in self.queryset:
# if user.id == obj.id:
# return user.rank
# get_rank.short_description = 'Rank'