重构用户权限

This commit is contained in:
2025-09-25 18:41:23 +08:00
parent 8436a4602f
commit a6d76a64c4
7 changed files with 72 additions and 58 deletions

View File

@@ -51,6 +51,9 @@ class User(AbstractBaseUser):
objects = UserManager()
def is_regular_user(self):
return self.admin_type == AdminType.REGULAR_USER
def is_admin(self):
return self.admin_type == AdminType.ADMIN

View File

@@ -1,4 +1,5 @@
from django import forms
from httpx import request
from utils.api import serializers, UsernameSerializer
@@ -131,7 +132,7 @@ class EditUserSerializer(serializers.Serializer):
open_api = serializers.BooleanField()
two_factor_auth = serializers.BooleanField()
is_disabled = serializers.BooleanField()
class_name = serializers.CharField(max_length=32, allow_blank=True, required=False)
class_name = serializers.CharField(required=False, allow_null=True)
class EditUserProfileSerializer(serializers.Serializer):
real_name = serializers.CharField(max_length=32, allow_null=True, required=False)

View File

@@ -106,7 +106,7 @@ class UserAdminAPI(APIView):
user.is_disabled = data["is_disabled"]
if data["admin_type"] == AdminType.ADMIN:
user.problem_permission = data["problem_permission"]
user.problem_permission = data["problem_permission"] or ProblemPermission.OWN
elif data["admin_type"] == AdminType.SUPER_ADMIN:
user.problem_permission = ProblemPermission.ALL
else:
@@ -156,10 +156,10 @@ class UserAdminAPI(APIView):
user = User.objects.all().order_by("-create_time")
is_admin = request.GET.get("admin", "0")
type = request.GET.get("type", "")
if is_admin == "1":
user = user.exclude(admin_type=AdminType.REGULAR_USER)
if type:
user = user.filter(admin_type=type)
keyword = request.GET.get("keyword", None)
if keyword:

View File

@@ -434,8 +434,9 @@ class UserRankAPI(APIView):
n = 0
if rule_type not in ContestRuleType.choices():
rule_type = ContestRuleType.ACM
profiles = UserProfile.objects.filter(
user__admin_type=AdminType.REGULAR_USER,
user__admin_type__in=[AdminType.REGULAR_USER, AdminType.ADMIN],
user__is_disabled=False,
user__username__icontains=username,
).select_related("user")
@@ -456,23 +457,19 @@ class UserActivityRankAPI(APIView):
if not start:
return self.error("start time is required")
hidden_names = User.objects.filter(
Q(admin_type=AdminType.SUPER_ADMIN)
| Q(admin_type=AdminType.ADMIN)
| Q(is_disabled=True)
Q(admin_type=AdminType.SUPER_ADMIN) | Q(is_disabled=True)
).values_list("username", flat=True)
submissions = Submission.objects.filter(
contest_id__isnull=True, create_time__gte=start, result=JudgeStatus.ACCEPTED
)
counts = (
contest_id__isnull=True,
create_time__gte=start,
result=JudgeStatus.ACCEPTED,
).exclude(username__in=hidden_names)
data = list(
submissions.values("username")
.annotate(count=Count("problem_id", distinct=True))
.order_by("-count")[: 10 + len(hidden_names)]
.order_by("-count")[:10]
)
data = []
for count in counts:
if count["username"] not in hidden_names:
data.append(count)
return self.success(data[:10])
return self.success(data)
class UserProblemRankAPI(APIView):
@@ -482,8 +479,12 @@ class UserProblemRankAPI(APIView):
if not user.is_authenticated:
return self.error("User is not authenticated")
problem = Problem.objects.get(_id=problem_id, contest_id__isnull=True, visible=True)
submissions = Submission.objects.filter(problem=problem, result=JudgeStatus.ACCEPTED)
problem = Problem.objects.get(
_id=problem_id, contest_id__isnull=True, visible=True
)
submissions = Submission.objects.filter(
problem=problem, result=JudgeStatus.ACCEPTED
)
all_ac_count = submissions.values("user_id").distinct().count()
@@ -491,29 +492,37 @@ class UserProblemRankAPI(APIView):
class_ac_count = 0
if class_name:
users = User.objects.filter(class_name=user.class_name, is_disabled=False).values_list("id", flat=True)
users = User.objects.filter(
class_name=user.class_name, is_disabled=False
).values_list("id", flat=True)
user_ids = list(users)
submissions = submissions.filter(user_id__in=user_ids)
class_ac_count = submissions.values("user_id").distinct().count()
my_submissions = submissions.filter(user_id=user.id)
if len(my_submissions) == 0:
return self.success({
"class_name": class_name,
"rank": -1,
"class_ac_count": class_ac_count,
"all_ac_count": all_ac_count
})
return self.success(
{
"class_name": class_name,
"rank": -1,
"class_ac_count": class_ac_count,
"all_ac_count": all_ac_count,
}
)
my_first_submission = my_submissions.order_by("create_time").first()
rank = submissions.filter(create_time__lte=my_first_submission.create_time).count()
return self.success({
"class_name": class_name,
"rank": rank,
"class_ac_count": class_ac_count,
"all_ac_count": all_ac_count,
})
rank = submissions.filter(
create_time__lte=my_first_submission.create_time
).count()
return self.success(
{
"class_name": class_name,
"rank": rank,
"class_ac_count": class_ac_count,
"all_ac_count": all_ac_count,
}
)
class ProfileProblemDisplayIDRefreshAPI(APIView):