70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
from django.contrib import admin
|
|
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from .models import OTPCode, TeacherProfile, User
|
|
|
|
|
|
@admin.register(User)
|
|
class UserAdmin(BaseUserAdmin):
|
|
ordering = ("-date_joined",)
|
|
list_display = ("phone_number", "full_name", "role", "is_active", "is_staff", "date_joined")
|
|
list_filter = ("role", "is_active", "is_staff")
|
|
search_fields = ("phone_number", "full_name", "email")
|
|
readonly_fields = ("last_login", "date_joined")
|
|
|
|
fieldsets = (
|
|
(None, {"fields": ("phone_number", "password")}),
|
|
(_("Personal info"), {"fields": ("full_name", "email", "language")}),
|
|
(
|
|
_("Role & permissions"),
|
|
{"fields": ("role", "is_active", "is_staff", "is_superuser", "groups", "user_permissions")},
|
|
),
|
|
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
|
|
)
|
|
add_fieldsets = (
|
|
(
|
|
None,
|
|
{
|
|
"classes": ("wide",),
|
|
"fields": ("phone_number", "full_name", "role", "password1", "password2"),
|
|
},
|
|
),
|
|
)
|
|
|
|
|
|
@admin.register(TeacherProfile)
|
|
class TeacherProfileAdmin(admin.ModelAdmin):
|
|
list_display = ("user", "headline", "is_verified", "is_approved", "approved_at", "approved_by")
|
|
list_filter = ("is_approved", "is_verified")
|
|
search_fields = ("user__phone_number", "user__full_name", "headline", "bio")
|
|
raw_id_fields = ("user", "approved_by")
|
|
actions = ["approve_selected"]
|
|
|
|
@admin.action(description=_("Approve selected teacher profiles"))
|
|
def approve_selected(self, request, queryset):
|
|
for tp in queryset.filter(is_approved=False):
|
|
tp.approve(by_user=request.user)
|
|
|
|
|
|
@admin.register(OTPCode)
|
|
class OTPCodeAdmin(admin.ModelAdmin):
|
|
list_display = ("phone_number", "code_masked", "created_at", "expires_at", "is_used", "attempts")
|
|
list_filter = ("is_used",)
|
|
search_fields = ("phone_number",)
|
|
readonly_fields = (
|
|
"phone_number",
|
|
"code",
|
|
"created_at",
|
|
"expires_at",
|
|
"attempts",
|
|
"is_used",
|
|
"consumed_at",
|
|
)
|
|
|
|
@admin.display(description=_("code"))
|
|
def code_masked(self, obj):
|
|
if not obj.code:
|
|
return ""
|
|
return obj.code[0] + "*" * (len(obj.code) - 1)
|