Browse Source

admin panel update + course auto ending timeout

master
Mohsen Taba 1 month ago
parent
commit
43b1d60322
  1. 70
      apps/account/admin/user.py
  2. 2
      apps/account/tasks.py
  3. 1
      apps/course/views/live_session.py

70
apps/account/admin/user.py

@ -23,6 +23,7 @@ from apps.course.models import Participant
# Import Admin Sites from utils # Import Admin Sites from utils
from utils.admin import project_admin_site, dovoodi_admin_site , is_dovoodi_panel from utils.admin import project_admin_site, dovoodi_admin_site , is_dovoodi_panel
from apps.account.admin.location import LocationHistoryInline from apps.account.admin.location import LocationHistoryInline
from unfold.widgets import UnfoldAdminSelectWidget
# ========================================================= # =========================================================
# 1. Base User Admin (Logic Shared by all User types) # 1. Base User Admin (Logic Shared by all User types)
@ -330,16 +331,81 @@ class CourseTableSection(TableSection):
) )
edit_link.short_description = _("Edit") 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): class ProfessorUserAdmin(UserAdmin):
form = UserAdminChangeForm form = UserAdminChangeForm
add_form = UserAdminCreationForm
add_form = ProfessorUpgradeForm # <--- آپدیت شد به فرم ارتقا
list_display = ('display_header', 'email', 'courses_count') list_display = ('display_header', 'email', 'courses_count')
list_sections = [CourseTableSection] list_sections = [CourseTableSection]
save_as = True 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) @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") avatar_path = instance.avatar.url if instance.avatar else static("images/reading(1).png")
return [ return [
instance.fullname, instance.fullname,

2
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)===******') print(f'=========(send-notif)===******')
response = requests.post(FCM_URL, headers=headers, json=payload) response = requests.post(FCM_URL, headers=headers, json=payload)
if response.status_code == 200: if response.status_code == 200:
logger.warning('Successfully sent message:', response.json())
logger.warning(f'Successfully sent message: {response.json()}')
responses.append(response.json()) responses.append(response.json())
else: else:
responses.append({'status': 'error', 'message': ""}) responses.append({'status': 'error', 'message': ""})

1
apps/course/views/live_session.py

@ -100,6 +100,7 @@ class CourseLiveSessionRoomCreateAPIView(GenericAPIView):
client = PlugNMeetClient() client = PlugNMeetClient()
plugnmeet_response = client.create_room({ plugnmeet_response = client.create_room({
'room_id': room_id, 'room_id': room_id,
'empty_timeout':90,
'metadata': metadata, 'metadata': metadata,
}) })
logger.info(f"[LiveSession Create] Room created in PlugNMeet - room_id={room_id}") logger.info(f"[LiveSession Create] Room created in PlugNMeet - room_id={room_id}")

Loading…
Cancel
Save