register and sign in pages
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
from django.contrib import admin, messages
|
||||
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
|
||||
|
||||
from .models import OtpCode, RegistrationTicket, User
|
||||
from .sms import send_registration_approved, send_registration_rejected
|
||||
|
||||
|
||||
@admin.register(User)
|
||||
class UserAdmin(BaseUserAdmin):
|
||||
ordering = ["-date_joined"]
|
||||
list_display = [
|
||||
"mobile",
|
||||
"full_name",
|
||||
"status",
|
||||
"idnumber",
|
||||
"island",
|
||||
"auth_method",
|
||||
"date_joined",
|
||||
]
|
||||
list_filter = ["status", "auth_method", "atoll", "is_staff", "is_active"]
|
||||
search_fields = ["mobile", "full_name", "email", "idnumber"]
|
||||
readonly_fields = [
|
||||
"date_joined",
|
||||
"updated_at",
|
||||
"last_login",
|
||||
"terms_accepted_at",
|
||||
"policy_accepted_at",
|
||||
"reviewed_at",
|
||||
"reviewed_by",
|
||||
]
|
||||
autocomplete_fields = ["atoll", "island"]
|
||||
actions = ["approve_registrations", "reject_registrations"]
|
||||
fieldsets = [
|
||||
(None, {"fields": ["mobile", "password"]}),
|
||||
(
|
||||
"Applicant",
|
||||
{
|
||||
"fields": [
|
||||
"full_name",
|
||||
"email",
|
||||
"idnumber",
|
||||
"date_of_birth",
|
||||
"atoll",
|
||||
"island",
|
||||
]
|
||||
},
|
||||
),
|
||||
(
|
||||
"Registration review",
|
||||
{
|
||||
"fields": [
|
||||
"status",
|
||||
"rejection_reason",
|
||||
"terms_accepted_at",
|
||||
"policy_accepted_at",
|
||||
"reviewed_at",
|
||||
"reviewed_by",
|
||||
]
|
||||
},
|
||||
),
|
||||
("Portal", {"fields": ["auth_method", "mobile_verified"]}),
|
||||
(
|
||||
"Permissions",
|
||||
{
|
||||
"fields": [
|
||||
"is_active",
|
||||
"is_staff",
|
||||
"is_superuser",
|
||||
"groups",
|
||||
"user_permissions",
|
||||
]
|
||||
},
|
||||
),
|
||||
("Dates", {"fields": ["last_login", "date_joined", "updated_at"]}),
|
||||
]
|
||||
add_fieldsets = [
|
||||
(
|
||||
None,
|
||||
{
|
||||
"classes": ["wide"],
|
||||
"fields": [
|
||||
"mobile",
|
||||
"full_name",
|
||||
"auth_method",
|
||||
"password1",
|
||||
"password2",
|
||||
],
|
||||
},
|
||||
),
|
||||
]
|
||||
|
||||
@admin.action(description="Approve selected registrations")
|
||||
def approve_registrations(self, request, queryset):
|
||||
pending = queryset.exclude(status=User.Status.APPROVED)
|
||||
for user in pending:
|
||||
user.approve(reviewer=request.user)
|
||||
send_registration_approved(user.mobile)
|
||||
self.message_user(
|
||||
request, f"Approved {pending.count()} registration(s).", messages.SUCCESS
|
||||
)
|
||||
|
||||
@admin.action(description="Reject selected registrations")
|
||||
def reject_registrations(self, request, queryset):
|
||||
pending = queryset.exclude(status=User.Status.REJECTED)
|
||||
for user in pending:
|
||||
user.reject(reviewer=request.user)
|
||||
send_registration_rejected(user.mobile, user.rejection_reason)
|
||||
self.message_user(
|
||||
request, f"Rejected {pending.count()} registration(s).", messages.WARNING
|
||||
)
|
||||
|
||||
|
||||
@admin.register(OtpCode)
|
||||
class OtpCodeAdmin(admin.ModelAdmin):
|
||||
list_display = [
|
||||
"mobile",
|
||||
"purpose",
|
||||
"attempts",
|
||||
"created_at",
|
||||
"expires_at",
|
||||
"consumed_at",
|
||||
]
|
||||
list_filter = ["purpose"]
|
||||
search_fields = ["mobile"]
|
||||
readonly_fields = [
|
||||
"user",
|
||||
"mobile",
|
||||
"purpose",
|
||||
"code_hash",
|
||||
"attempts",
|
||||
"created_at",
|
||||
"expires_at",
|
||||
"consumed_at",
|
||||
]
|
||||
|
||||
|
||||
@admin.register(RegistrationTicket)
|
||||
class RegistrationTicketAdmin(admin.ModelAdmin):
|
||||
list_display = ["mobile", "created_at", "expires_at", "consumed_at"]
|
||||
search_fields = ["mobile"]
|
||||
readonly_fields = ["key", "mobile", "created_at", "expires_at", "consumed_at"]
|
||||
Reference in New Issue
Block a user