diff --git a/account/urls/oj.py b/account/urls/oj.py index dbdbc12..35c2155 100644 --- a/account/urls/oj.py +++ b/account/urls/oj.py @@ -4,7 +4,7 @@ from ..views.oj import (ApplyResetPasswordAPI, ResetPasswordAPI, UserChangePasswordAPI, UserRegisterAPI, UserChangeEmailAPI, UserLoginAPI, UserLogoutAPI, UsernameOrEmailCheck, AvatarUploadAPI, TwoFactorAuthAPI, UserProfileAPI, - UserRankAPI, CheckTFARequiredAPI, SessionManagementAPI, + UserRankAPI, UserActivityRankAPI, CheckTFARequiredAPI, SessionManagementAPI, ProfileProblemDisplayIDRefreshAPI, OpenAPIAppkeyAPI, SSOAPI) from utils.captcha.views import CaptchaAPIView @@ -25,6 +25,7 @@ urlpatterns = [ path("tfa_required", CheckTFARequiredAPI.as_view()), path("two_factor_auth", TwoFactorAuthAPI.as_view(),), path("user_rank", UserRankAPI.as_view()), + path("user_activity_rank", UserActivityRankAPI.as_view()), path("sessions", SessionManagementAPI.as_view()), path("open_api_appkey", OpenAPIAppkeyAPI.as_view(),), path("sso", SSOAPI.as_view()) diff --git a/account/views/oj.py b/account/views/oj.py index aff7d62..401c893 100644 --- a/account/views/oj.py +++ b/account/views/oj.py @@ -9,9 +9,11 @@ from django.template.loader import render_to_string from django.utils.decorators import method_decorator from django.utils.timezone import now from django.views.decorators.csrf import ensure_csrf_cookie, csrf_exempt +from django.db.models import Count from otpauth import OtpAuth from problem.models import Problem +from submission.models import Submission from utils.constants import ContestRuleType from options.options import SysOptions from utils.api import APIView, validate_serializer, CSRFExemptAPIView @@ -394,6 +396,16 @@ class UserRankAPI(APIView): return self.success(self.paginate_data(request, profiles, RankInfoSerializer)) +class UserActivityRankAPI(APIView): + def get(self, request): + start = request.GET.get("start") + if not start: + return self.error("start time is required") + submissions = Submission.objects.filter(contest_id__isnull=True, create_time__gte=start) + counts = submissions.values("username").annotate(count=Count("id")).order_by("-count") + return self.success(list(counts)[:10]) + + class ProfileProblemDisplayIDRefreshAPI(APIView): @login_required def get(self, request):