diff --git a/apps/account/models/user.py b/apps/account/models/user.py index 553430d..00dbd6f 100644 --- a/apps/account/models/user.py +++ b/apps/account/models/user.py @@ -184,6 +184,9 @@ class User(AbstractUser): if role_name in ['professor', self.UserType.PROFESSOR] and self.user_type != self.UserType.PROFESSOR: self.user_type = self.UserType.PROFESSOR self.save() + elif role_name in ['consultant', self.UserType.CONSULTANT] and self.user_type in [self.UserType.CLIENT, self.UserType.STUDENT]: + self.user_type = self.UserType.CONSULTANT + self.save() elif role_name in ['student', self.UserType.STUDENT] and self.user_type == self.UserType.CLIENT: self.user_type = self.UserType.STUDENT self.save() @@ -257,12 +260,22 @@ class User(AbstractUser): ) ) + def is_consultant_panel_user(self): + """آیا کاربر از طریق نقش مشاور اجازه ورود به پنل را دارد؟""" + return bool( + self.is_active and ( + self.user_type == self.UserType.CONSULTANT or + self.has_role('consultant') + ) + ) + def can_access_admin_panel(self): - """سوپر ادمین‌ها، ادمین‌ها و استادها اجازه ورود به پنل را دارند.""" + """سوپر ادمین‌ها، ادمین‌ها، استادها و مشاورها اجازه ورود به پنل را دارند.""" return ( self.is_super_admin_panel_user() or self.is_admin_panel_user() or - self.is_professor_panel_user() + self.is_professor_panel_user() or + self.is_consultant_panel_user() ) def can_enroll_course(self): """آیا می‌تواند در دوره ثبت‌نام کند؟""" diff --git a/apps/account/serializers/user.py b/apps/account/serializers/user.py index 7282fc6..a074320 100644 --- a/apps/account/serializers/user.py +++ b/apps/account/serializers/user.py @@ -296,7 +296,7 @@ class AdminUserSerializer(serializers.ModelSerializer): User.UserType.SUPER_ADMIN: "Super Admin Group", User.UserType.CONSULTANT: "Consultant Group", } - PANEL_GROUPS = {"Professor Group", "Admin Group", "Super admin Group", "Super Admin Group"} + PANEL_GROUPS = {"Professor Group", "Admin Group", "Super admin Group", "Super Admin Group", "Consultant Group"} def _ensure_group(self, instance, group_name): group, _ = Group.objects.get_or_create(name=group_name) @@ -317,21 +317,21 @@ class AdminUserSerializer(serializers.ModelSerializer): instance.is_staff = True instance.is_superuser = True self._ensure_group(instance, "Super Admin Group") - self._remove_groups(instance, {"Professor Group", "Admin Group", "Super admin Group"}) + self._remove_groups(instance, {"Professor Group", "Admin Group", "Super admin Group", "Consultant Group"}) return if requested_user_type == User.UserType.PROFESSOR: instance.is_staff = False instance.is_superuser = False self._ensure_group(instance, "Professor Group") - self._remove_groups(instance, {"Admin Group", "Super admin Group", "Super Admin Group"}) + self._remove_groups(instance, {"Admin Group", "Super admin Group", "Super Admin Group", "Consultant Group"}) return if requested_user_type == User.UserType.ADMIN: instance.is_staff = False instance.is_superuser = False self._ensure_group(instance, "Admin Group") - self._remove_groups(instance, {"Professor Group", "Super admin Group", "Super Admin Group"}) + self._remove_groups(instance, {"Professor Group", "Super admin Group", "Super Admin Group", "Consultant Group"}) return if requested_user_type == User.UserType.STUDENT: @@ -345,7 +345,7 @@ class AdminUserSerializer(serializers.ModelSerializer): instance.is_staff = False instance.is_superuser = False self._ensure_group(instance, "Consultant Group") - self._remove_groups(instance, self.PANEL_GROUPS) + self._remove_groups(instance, {"Professor Group", "Admin Group", "Super admin Group", "Super Admin Group", "Student Group"}) return if requested_user_type == User.UserType.CLIENT: diff --git a/apps/account/views/user.py b/apps/account/views/user.py index bc78349..0533b59 100644 --- a/apps/account/views/user.py +++ b/apps/account/views/user.py @@ -727,6 +727,8 @@ class AdminLoginView(CreateAPIView): effective_user_type = 'super_admin' elif user.is_admin_panel_user(): effective_user_type = 'admin' + elif user.is_consultant_panel_user(): + effective_user_type = 'consultant' else: effective_user_type = 'professor' @@ -834,8 +836,13 @@ class AdminUserViewSet(ModelViewSet): # Handle user type filter user_type_param = self.request.query_params.get('user_type', None) if user_type_param: - if user_type_param == 'student': - queryset = queryset.filter(Q(user_type='student') | Q(user_type='client')) + if user_type_param in ('student', 'client', 'user'): + queryset = queryset.filter( + Q(user_type='student') | Q(user_type='client'), + is_superuser=False, + ).exclude(groups__name__in=['Consultant Group', 'Admin Group', 'Super Admin Group', 'Professor Group']) + elif user_type_param == 'consultant': + queryset = queryset.filter(Q(user_type='consultant') | Q(groups__name='Consultant Group')) else: queryset = queryset.filter(user_type=user_type_param) @@ -898,8 +905,8 @@ class AdminUserDirectoryViewSet(ModelViewSet): role_map = { 'professor': 'Professor', - 'client': 'Student', - 'student': 'Student', + 'client': 'User', + 'student': 'User', 'admin': 'Admin', 'super_admin': 'Super Admin', 'consultant': 'Consultant', @@ -907,7 +914,7 @@ class AdminUserDirectoryViewSet(ModelViewSet): rows = [] for user in queryset: - role_label = role_map.get(user.user_type, user.user_type or "Student") + role_label = role_map.get(user.user_type, user.user_type or "User") rows.append([ user.id, user.fullname or "Unnamed", @@ -957,8 +964,13 @@ class AdminUserDirectoryViewSet(ModelViewSet): # Handle user type filter user_type_param = self.request.query_params.get('user_type', None) if user_type_param: - if user_type_param == 'student': - queryset = queryset.filter(Q(user_type='student') | Q(user_type='client')) + if user_type_param in ('student', 'client', 'user'): + queryset = queryset.filter( + Q(user_type='student') | Q(user_type='client'), + is_superuser=False, + ).exclude(groups__name__in=['Consultant Group', 'Admin Group', 'Super Admin Group', 'Professor Group']) + elif user_type_param == 'consultant': + queryset = queryset.filter(Q(user_type='consultant') | Q(groups__name='Consultant Group')) else: queryset = queryset.filter(user_type=user_type_param) diff --git a/apps/support/serializers.py b/apps/support/serializers.py index 33a1af0..8451101 100644 --- a/apps/support/serializers.py +++ b/apps/support/serializers.py @@ -23,9 +23,7 @@ class SupportMessageSerializer(serializers.ModelSerializer): def get_sender_name(self, obj: SupportMessage) -> str: if obj.sender_type == SupportMessage.SenderType.SUPPORT: - if obj.sender and obj.sender.fullname: - return obj.sender.fullname - return 'Support Specialist' + return 'Islamic Scholar' if obj.sender and obj.sender.fullname: return obj.sender.fullname return 'You'