diff --git a/apps/account/admin/user.py b/apps/account/admin/user.py index 3af88c2..b765ac2 100644 --- a/apps/account/admin/user.py +++ b/apps/account/admin/user.py @@ -23,6 +23,7 @@ from apps.course.models import Participant # Import Admin Sites from utils from utils.admin import project_admin_site, dovoodi_admin_site , is_dovoodi_panel from apps.account.admin.location import LocationHistoryInline +from unfold.widgets import UnfoldAdminSelectWidget # ========================================================= # 1. Base User Admin (Logic Shared by all User types) @@ -330,16 +331,81 @@ class CourseTableSection(TableSection): ) edit_link.short_description = _("Edit") +class ProfessorUpgradeForm(forms.ModelForm): + existing_user = forms.ModelChoiceField( + queryset=User.objects.exclude(groups__name="Professor Group"), + required=True, + label=_("Select Existing User"), + help_text=_("Choose an existing user to upgrade to Professor."), + widget=UnfoldAdminSelectWidget, + ) + + class Meta: + model = ProfessorUser + fields = ("existing_user", "is_active", "is_staff", "is_superuser", "groups") + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if 'groups' in self.fields: + self.fields['groups'].required = False + + def _post_clean(self): + # جلوگیری از اعتبارسنجی مدل خالی برای جلوگیری از ارور فیلدهای اجباری + pass + + def save(self, commit=True): + # کاربر موجود (که هنوز پروفسور نیست) را می‌گیریم + user = self.cleaned_data.get('existing_user') + + # ابتدا user_type را تغییر می‌دهیم تا با Manager پروفسور سازگار شود + user.user_type = User.UserType.PROFESSOR + user.is_active = self.cleaned_data.get('is_active', user.is_active) + user.is_staff = self.cleaned_data.get('is_staff', user.is_staff) + user.is_superuser = self.cleaned_data.get('is_superuser', user.is_superuser) + user.save() # ذخیره با مدل User + + # حالا که user_type آپدیت شد، می‌توانیم آن را به عنوان ProfessorUser واکشی کنیم + prof_user = ProfessorUser.objects.get(pk=user.pk) + + # برای ذخیره‌سازی ManyToMany (مثل groups)، باید instance فرم ست شود + self.instance = prof_user + + def save_m2m(): + groups = self.cleaned_data.get('groups') + if groups is not None: + self.instance.groups.set(groups) + # اضافه‌کردن کاربر به گروه پروفسورها و ساخت اسلاگ (در صورت نیاز) + self.instance.ensure_professor_profile(commit=True) + + self.save_m2m = save_m2m + + if commit: + self.save_m2m() + + return prof_user + class ProfessorUserAdmin(UserAdmin): form = UserAdminChangeForm - add_form = UserAdminCreationForm + add_form = ProfessorUpgradeForm # <--- آپدیت شد به فرم ارتقا list_display = ('display_header', 'email', 'courses_count') list_sections = [CourseTableSection] save_as = True + # بازنویسی کامل فیلدست‌های صفحه Add (ساخت) + add_fieldsets = ( + (None, { + 'classes': ('wide',), + 'fields': ('existing_user',), + }), + (_('Permissions'), { + 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups'), + 'classes': ('wide',), + }), + ) + @display(description=_("Professor"), header=True) - def display_header(self, instance: StudentUser): + def display_header(self, instance: ProfessorUser): avatar_path = instance.avatar.url if instance.avatar else static("images/reading(1).png") return [ instance.fullname, diff --git a/apps/account/tasks.py b/apps/account/tasks.py index 7ce0e3e..aafcdab 100644 --- a/apps/account/tasks.py +++ b/apps/account/tasks.py @@ -94,7 +94,7 @@ async def send_notification(ids: list, title: str = None, body: str = None, data print(f'=========(send-notif)===******') response = requests.post(FCM_URL, headers=headers, json=payload) if response.status_code == 200: - logger.warning('Successfully sent message:', response.json()) + logger.warning(f'Successfully sent message: {response.json()}') responses.append(response.json()) else: responses.append({'status': 'error', 'message': ""}) diff --git a/apps/course/views/live_session.py b/apps/course/views/live_session.py index 52dfd68..62bee4f 100644 --- a/apps/course/views/live_session.py +++ b/apps/course/views/live_session.py @@ -100,6 +100,7 @@ class CourseLiveSessionRoomCreateAPIView(GenericAPIView): client = PlugNMeetClient() plugnmeet_response = client.create_room({ 'room_id': room_id, + 'empty_timeout':90, 'metadata': metadata, }) logger.info(f"[LiveSession Create] Room created in PlugNMeet - room_id={room_id}")