Browse Source

feat(account): add consultant role for support chat response and panel access

- Add is_consultant_panel_user method and grant consultant panel access
- Handle Consultant Group assignment in AdminUserSerializer
- Support consultant login in AdminLoginView
- Add consultant filter option in AdminUserViewSet and AdminUserDirectoryViewSet
- Unify support specialist sender name to 'Islamic Scholar'
master
Mohsen Taba 2 weeks ago
parent
commit
b9ffbc0d69
  1. 17
      apps/account/models/user.py
  2. 10
      apps/account/serializers/user.py
  3. 26
      apps/account/views/user.py
  4. 4
      apps/support/serializers.py

17
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: if role_name in ['professor', self.UserType.PROFESSOR] and self.user_type != self.UserType.PROFESSOR:
self.user_type = self.UserType.PROFESSOR self.user_type = self.UserType.PROFESSOR
self.save() 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: elif role_name in ['student', self.UserType.STUDENT] and self.user_type == self.UserType.CLIENT:
self.user_type = self.UserType.STUDENT self.user_type = self.UserType.STUDENT
self.save() 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): def can_access_admin_panel(self):
"""سوپر ادمین‌ها، ادمین‌ها و استادها اجازه ورود به پنل را دارند."""
"""سوپر ادمین‌ها، ادمین‌ها، استادها و مشاورها اجازه ورود به پنل را دارند."""
return ( return (
self.is_super_admin_panel_user() or self.is_super_admin_panel_user() or
self.is_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): def can_enroll_course(self):
"""آیا می‌تواند در دوره ثبت‌نام کند؟""" """آیا می‌تواند در دوره ثبت‌نام کند؟"""

10
apps/account/serializers/user.py

@ -296,7 +296,7 @@ class AdminUserSerializer(serializers.ModelSerializer):
User.UserType.SUPER_ADMIN: "Super Admin Group", User.UserType.SUPER_ADMIN: "Super Admin Group",
User.UserType.CONSULTANT: "Consultant 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): def _ensure_group(self, instance, group_name):
group, _ = Group.objects.get_or_create(name=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_staff = True
instance.is_superuser = True instance.is_superuser = True
self._ensure_group(instance, "Super Admin Group") 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 return
if requested_user_type == User.UserType.PROFESSOR: if requested_user_type == User.UserType.PROFESSOR:
instance.is_staff = False instance.is_staff = False
instance.is_superuser = False instance.is_superuser = False
self._ensure_group(instance, "Professor Group") 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 return
if requested_user_type == User.UserType.ADMIN: if requested_user_type == User.UserType.ADMIN:
instance.is_staff = False instance.is_staff = False
instance.is_superuser = False instance.is_superuser = False
self._ensure_group(instance, "Admin Group") 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 return
if requested_user_type == User.UserType.STUDENT: if requested_user_type == User.UserType.STUDENT:
@ -345,7 +345,7 @@ class AdminUserSerializer(serializers.ModelSerializer):
instance.is_staff = False instance.is_staff = False
instance.is_superuser = False instance.is_superuser = False
self._ensure_group(instance, "Consultant Group") 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 return
if requested_user_type == User.UserType.CLIENT: if requested_user_type == User.UserType.CLIENT:

26
apps/account/views/user.py

@ -727,6 +727,8 @@ class AdminLoginView(CreateAPIView):
effective_user_type = 'super_admin' effective_user_type = 'super_admin'
elif user.is_admin_panel_user(): elif user.is_admin_panel_user():
effective_user_type = 'admin' effective_user_type = 'admin'
elif user.is_consultant_panel_user():
effective_user_type = 'consultant'
else: else:
effective_user_type = 'professor' effective_user_type = 'professor'
@ -834,8 +836,13 @@ class AdminUserViewSet(ModelViewSet):
# Handle user type filter # Handle user type filter
user_type_param = self.request.query_params.get('user_type', None) user_type_param = self.request.query_params.get('user_type', None)
if user_type_param: 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: else:
queryset = queryset.filter(user_type=user_type_param) queryset = queryset.filter(user_type=user_type_param)
@ -898,8 +905,8 @@ class AdminUserDirectoryViewSet(ModelViewSet):
role_map = { role_map = {
'professor': 'Professor', 'professor': 'Professor',
'client': 'Student',
'student': 'Student',
'client': 'User',
'student': 'User',
'admin': 'Admin', 'admin': 'Admin',
'super_admin': 'Super Admin', 'super_admin': 'Super Admin',
'consultant': 'Consultant', 'consultant': 'Consultant',
@ -907,7 +914,7 @@ class AdminUserDirectoryViewSet(ModelViewSet):
rows = [] rows = []
for user in queryset: 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([ rows.append([
user.id, user.id,
user.fullname or "Unnamed", user.fullname or "Unnamed",
@ -957,8 +964,13 @@ class AdminUserDirectoryViewSet(ModelViewSet):
# Handle user type filter # Handle user type filter
user_type_param = self.request.query_params.get('user_type', None) user_type_param = self.request.query_params.get('user_type', None)
if user_type_param: 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: else:
queryset = queryset.filter(user_type=user_type_param) queryset = queryset.filter(user_type=user_type_param)

4
apps/support/serializers.py

@ -23,9 +23,7 @@ class SupportMessageSerializer(serializers.ModelSerializer):
def get_sender_name(self, obj: SupportMessage) -> str: def get_sender_name(self, obj: SupportMessage) -> str:
if obj.sender_type == SupportMessage.SenderType.SUPPORT: 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: if obj.sender and obj.sender.fullname:
return obj.sender.fullname return obj.sender.fullname
return 'You' return 'You'

Loading…
Cancel
Save