diff --git a/account/urls/oj.py b/account/urls/oj.py index 0af54a5..c1915f4 100644 --- a/account/urls/oj.py +++ b/account/urls/oj.py @@ -4,7 +4,8 @@ from ..views.oj import (ApplyResetPasswordAPI, ResetPasswordAPI, UserChangePasswordAPI, UserRegisterAPI, UserChangeEmailAPI, UserLoginAPI, UserLogoutAPI, UsernameOrEmailCheck, AvatarUploadAPI, TwoFactorAuthAPI, UserProfileAPI, - UserRankAPI, CheckTFARequiredAPI, SessionManagementAPI) + UserRankAPI, CheckTFARequiredAPI, SessionManagementAPI, + ProfileProblemDisplayIDRefreshAPI) from utils.captcha.views import CaptchaAPIView @@ -19,6 +20,7 @@ urlpatterns = [ url(r"^captcha/?$", CaptchaAPIView.as_view(), name="show_captcha"), url(r"^check_username_or_email", UsernameOrEmailCheck.as_view(), name="check_username_or_email"), url(r"^profile/?$", UserProfileAPI.as_view(), name="user_profile_api"), + url(r"^profile/fresh_display_id", ProfileProblemDisplayIDRefreshAPI.as_view(), name="display_id_fresh"), url(r"^upload_avatar/?$", AvatarUploadAPI.as_view(), name="avatar_upload_api"), url(r"^tfa_required/?$", CheckTFARequiredAPI.as_view(), name="tfa_required_check"), url(r"^two_factor_auth/?$", TwoFactorAuthAPI.as_view(), name="two_factor_auth_api"), diff --git a/account/views/admin.py b/account/views/admin.py index 6ae3baa..9d1359f 100644 --- a/account/views/admin.py +++ b/account/views/admin.py @@ -1,5 +1,6 @@ from django.db.models import Q +from submission.models import Submission from utils.api import APIView, validate_serializer from utils.shortcuts import rand_str @@ -25,6 +26,7 @@ class UserAdminAPI(APIView): if User.objects.filter(email=data["email"].lower()).exclude(id=user.id).exists(): return self.error("Email already exists") + pre_username = user.username user.username = data["username"] user.email = data["email"] user.admin_type = data["admin_type"] @@ -58,6 +60,8 @@ class UserAdminAPI(APIView): user.two_factor_auth = data["two_factor_auth"] user.save() + if pre_username != user.username: + Submission.objects.filter(username=pre_username).update(username=user.username) return self.success(UserSerializer(user).data) @super_admin_required diff --git a/account/views/oj.py b/account/views/oj.py index 76d363f..50aa9db 100644 --- a/account/views/oj.py +++ b/account/views/oj.py @@ -11,6 +11,7 @@ from django.utils.timezone import now from django.views.decorators.csrf import ensure_csrf_cookie from otpauth import OtpAuth +from problem.models import Problem from utils.constants import ContestRuleType from options.options import SysOptions from utils.api import APIView, validate_serializer @@ -379,3 +380,21 @@ class UserRankAPI(APIView): else: profiles = profiles.filter(total_score__gt=0).order_by("-total_score") return self.success(self.paginate_data(request, profiles, RankInfoSerializer)) + + +class ProfileProblemDisplayIDRefreshAPI(APIView): + @login_required + def get(self, request): + profile = request.user.userprofile + acm_problems = profile.acm_problems_status["problems"] + oi_problems = profile.oi_problems_status["problems"] + ids = list(acm_problems.keys()) + list(oi_problems.keys()) + display_ids = Problem.objects.filter(id__in=ids).values_list("_id", flat=True) + id_map = dict(zip(ids, display_ids)) + print(id_map) + for k, v in acm_problems.items(): + v["_id"] = id_map[k] + for k, v in oi_problems.items(): + v["_id"] = id_map[k] + profile.save(update_fields=["acm_problems_status", "oi_problems_status"]) + return self.success() diff --git a/contest/views/oj.py b/contest/views/oj.py index d50e0e9..612ebd4 100644 --- a/contest/views/oj.py +++ b/contest/views/oj.py @@ -16,7 +16,7 @@ class ContestAnnouncementListAPI(APIView): def get(self, request): contest_id = request.GET.get("contest_id") if not contest_id: - return self.error("Invalid parameter") + return self.error("Invalid parameter, contest_id is required") data = ContestAnnouncement.objects.select_related("created_by").filter(contest_id=contest_id, visible=True) max_id = request.GET.get("max_id") if max_id: @@ -28,7 +28,7 @@ class ContestAPI(APIView): def get(self, request): id = request.GET.get("id") if not id: - return self.error("Invalid parameter") + return self.error("Invalid parameter, id is required") try: contest = Contest.objects.get(id=id) return self.success(ContestSerializer(contest).data)