You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

125 lines
4.6 KiB

# This file is no longer used. All admin classes are now in user.pyfrom django.contrib import admin
from django.contrib.auth.forms import UserChangeForm, UsernameField, UserCreationForm
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _
from rest_framework.authtoken.models import TokenProxy
from ajaxdatatable.admin import AjaxDatatable
from django.contrib import admin
from apps.account.models import User
from django import forms
from django.urls import path, reverse
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.models import Group
from phonenumber_field.formfields import PhoneNumberField
from apps.account.models import ProfessorUser
class ProfessorUserCreationForm(UserCreationForm):
phone_number = PhoneNumberField(
help_text="Enter the phone number in international format. Example: +989012023212",
required=False
)
class Meta:
model = ProfessorUser
fields = ('fullname', 'email', 'phone_number')
@admin.register(ProfessorUser)
class ProfessorUserAdmin(UserAdmin, AjaxDatatable):
add_form = ProfessorUserCreationForm
list_display = (
'email', 'fullname', 'last_login', 'date_joined',
)
ordering = 'last_login',
readonly_fields = ('date_joined',)
exclude = ('password', 'user_permissions')
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('fullname', 'email', 'phone_number',),
}),
('other', {
'classes': ('wide',),
'fields': ('avatar', 'info', 'skill'),
}),
('Password', {
'classes': ('wide',),
'fields': ('password1', 'password2'),
}),
)
search_fields = (
'email', 'fullname',
)
fieldsets = (
(_('Personal info'), {'fields': ('fullname', 'email', 'phone_number', 'avatar', 'info', 'skill')}),
(_('Permissions'), {
'fields': ('is_active', 'groups', 'password'),
}),
(_('Important dates'), {'fields': ('last_login', 'date_joined', 'fcm')}),
)
def save_model(self, request, obj, form, change):
if not change: # Creating a new professor
# Check if a user with this email already exists
email = form.cleaned_data.get('email')
existing_user = User.objects.filter(email=email).first()
if existing_user:
# If user exists and is already a professor, show error
if existing_user.user_type == User.UserType.PROFESSOR:
messages.error(request, f"A professor with the email {email} already exists.")
return
# If user exists but is not a professor, convert them to professor
existing_user.user_type = User.UserType.PROFESSOR
# Update user fields from form data
existing_user.fullname = form.cleaned_data.get('fullname')
existing_user.phone_number = form.cleaned_data.get('phone_number')
existing_user.avatar = form.cleaned_data.get('avatar')
existing_user.info = form.cleaned_data.get('info')
existing_user.skill = form.cleaned_data.get('skill')
# Set password if provided
if 'password1' in form.cleaned_data and form.cleaned_data['password1']:
existing_user.set_password(form.cleaned_data['password1'])
# Save the user
existing_user.save()
# Add to professor group
professor_group, _ = Group.objects.get_or_create(name="Professor Group")
existing_user.groups.add(professor_group)
# Show success message
messages.success(request, f"The user with email {email} has been converted to a professor.")
# Set obj to None to prevent further processing
obj = None
return
else:
# New user, set password
obj.set_password(form.cleaned_data['password1'])
if obj: # Only proceed if obj is not None
obj.user_type = User.UserType.PROFESSOR
super().save_model(request, obj, form, change)
@admin.display(description='Phone Number')
def _phone_number(self, obj):
return obj.phone_number
def get_readonly_fields(self, request, obj=None):
"""
Restrict the ability to modify groups to superusers only.
"""
readonly = list(self.readonly_fields)
if not request.user.is_superuser:
readonly.append('groups')
return readonly