diff --git a/accounts/admin.py b/accounts/admin.py index e06ba4f..07d27c2 100644 --- a/accounts/admin.py +++ b/accounts/admin.py @@ -5,8 +5,11 @@ from .models import User @admin.register(User) class UserAdmin(DefaultUserAdmin): - list_display = ("username", "email", "role", "is_active", "is_staff", "last_login") + list_display = ("username", "email", "role", "source_manager", "is_active", "is_staff", "last_login") list_filter = ("role", "is_active", "is_staff", "is_superuser") + search_fields = ("username", "email") fieldsets = DefaultUserAdmin.fieldsets + ( - ("角色权限", {"fields": ("role",)}), - ) \ No newline at end of file + ("角色权限", {"fields": ("role", "source_manager")}), + ("网站权限", {"fields": ("managed_websites", "authorized_websites")}), + ) + filter_horizontal = ("groups", "user_permissions", "managed_websites", "authorized_websites") diff --git a/accounts/api/auth.py b/accounts/api/auth.py index a04d0a8..a1342ff 100644 --- a/accounts/api/auth.py +++ b/accounts/api/auth.py @@ -15,25 +15,30 @@ def register( username: str = Form(...), password: str = Form(...), email: str = Form(...), - code: str = Form(None) + code: str = Form(...) ): if User.objects.filter(username=username).exists(): return {"success": False, "message": "用户名已存在"} - user = User(username=username, email=email, role="user") + try: + reg = RegistrationCode.objects.get(code=code) + if not reg.is_available(): + return {"success": False, "message": "注册码已达使用上限"} + except RegistrationCode.DoesNotExist: + return {"success": False, "message": "注册码无效"} + + user = User( + username=username, + email=email, + role="user", + source_manager=reg.manager + ) user.set_password(password) user.save() - if code: - try: - reg = RegistrationCode.objects.get(code=code) - if not reg.is_available(): - return {"success": False, "message": "注册码已达使用上限"} - user.authorized_websites.set(reg.manager.managed_websites.all()) - reg.used_count += 1 - reg.save() - except RegistrationCode.DoesNotExist: - return {"success": False, "message": "注册码无效"} + reg.used_count += 1 + reg.save() + RegistrationCode.objects.create(code=reg, user=user) refresh = RefreshToken.for_user(user) @@ -51,6 +56,7 @@ def register( } } + @auth_router.post("/login") def login( request, diff --git a/accounts/api/authorize.py b/accounts/api/authorize.py index b61ec04..02d9fd1 100644 --- a/accounts/api/authorize.py +++ b/accounts/api/authorize.py @@ -117,13 +117,20 @@ def approve_request(request, request_id: int = Query(...), approve: bool = Query @router.get("/my-sites", auth=jwt_auth) @login_required -def list_my_authorized_websites(request): +def list_user_manager_websites(request): user = request.user - sites = user.authorized_websites.all().values("id", "name", "db_alias") + + if not user.is_user(): + return {"success": False, "message": "仅普通用户可申请网站"} + + if not user.source_manager: + return {"success": False, "message": "您尚未绑定所属分管理,无法申请网站"} + + sites = user.source_manager.managed_websites.all().values("id", "name", "db_alias") return {"success": True, "websites": list(sites)} @router.get("/public-sites") def list_public_websites(request): - websites = Website.objects.all().values("id", "name", "db_alias", "description") + websites = Website.objects.all().values("id", "name") return {"success": True, "websites": list(websites)} diff --git a/accounts/models.py b/accounts/models.py index 011838c..1163feb 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -21,6 +21,15 @@ class User(AbstractUser): related_name="authorized_users", help_text="普通用户被授权可访问的网站" ) + source_manager = models.ForeignKey( + "self", + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="brought_users", + limit_choices_to={"role": "manager"}, + verbose_name="所属分管理" + ) def is_admin(self): return self.role == 'admin' diff --git a/resumes/admin.py b/resumes/admin.py index d11be66..7371465 100644 --- a/resumes/admin.py +++ b/resumes/admin.py @@ -9,3 +9,18 @@ class ResumeDetailInline(admin.StackedInline): class ResumeDetailAdmin(admin.ModelAdmin): list_display = ("resume", "phone", "updated_at") search_fields = ("resume__name", "phone") + +@admin.register(ResumeBasic) +class ResumeBasicAdmin(admin.ModelAdmin): + list_display = ( + 'resume_id', 'name', 'age', 'gender', 'job_status', 'education', + 'expected_position', 'last_active_time', 'update_time' + ) + search_fields = ('name', 'phone', 'resume_id') + list_filter = ('job_status', 'gender', 'education', 'highest_education', 'source') + ordering = ('-update_time',) + + @admin.display(description='数据来源') + def source_name(self, obj): + print(obj.source.name) + return obj.source.name if obj.source else "-" \ No newline at end of file diff --git a/websites/models.py b/websites/models.py index e738646..e780487 100644 --- a/websites/models.py +++ b/websites/models.py @@ -7,6 +7,9 @@ class Website(models.Model): db_alias = models.CharField(max_length=50, unique=True, verbose_name="数据库别名") description = models.TextField(blank=True, verbose_name="描述") + def __str__(self): + return self.name + class Meta: verbose_name = "网站" verbose_name_plural = "网站列表"