feat(admin): manage user social account links

This commit is contained in:
2026-05-14 23:00:11 +03:30
parent aa0b0c8686
commit 837f5bb49e

View File

@@ -3,6 +3,7 @@ from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import SetPasswordForm from django.contrib.auth.forms import SetPasswordForm
from django.db import transaction
from django.shortcuts import redirect from django.shortcuts import redirect
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.urls import reverse_lazy from django.urls import reverse_lazy
@@ -11,6 +12,7 @@ from unfold.decorators import action as unfold_action
from core.admins.base import BaseAdmin, SoftDeleteListFilter from core.admins.base import BaseAdmin, SoftDeleteListFilter
from apps.users.models import UserSocialAccount
from apps.users.services.forms import CustomUserChangeForm, CustomUserCreationForm from apps.users.services.forms import CustomUserChangeForm, CustomUserCreationForm
User = get_user_model() User = get_user_model()
@@ -21,6 +23,34 @@ class UserResource(resources.ModelResource):
model = User model = User
class UserSocialAccountInline(admin.TabularInline):
model = UserSocialAccount
fk_name = "user"
extra = 0
autocomplete_fields = ("user",)
fields = (
"provider",
"provider_user_id",
"email",
"email_verified",
"avatar_url",
"is_deleted",
"created_at",
"updated_at",
)
readonly_fields = (
"provider",
"provider_user_id",
"email",
"email_verified",
"avatar_url",
"is_deleted",
"created_at",
"updated_at",
)
show_change_link = True
@admin.register(User) @admin.register(User)
class CustomUserAdmin(BaseUserAdmin, BaseAdmin): class CustomUserAdmin(BaseUserAdmin, BaseAdmin):
model = User model = User
@@ -136,6 +166,7 @@ class CustomUserAdmin(BaseUserAdmin, BaseAdmin):
), ),
) )
filter_horizontal = ("groups", "user_permissions") filter_horizontal = ("groups", "user_permissions")
inlines = (UserSocialAccountInline,)
actions_row = [ actions_row = [
"reset_password_action", "reset_password_action",
@@ -181,3 +212,53 @@ class CustomUserAdmin(BaseUserAdmin, BaseAdmin):
@admin.action(description="Deactivate selected users") @admin.action(description="Deactivate selected users")
def deactivate_users(self, request, queryset): def deactivate_users(self, request, queryset):
queryset.update(is_active=False) queryset.update(is_active=False)
@admin.register(UserSocialAccount)
class UserSocialAccountAdmin(BaseAdmin):
list_display = (
"provider",
"provider_user_id",
"user",
"email",
"email_verified",
"created_at",
"is_deleted",
)
search_fields = (
"provider_user_id",
"email",
"user__mobile",
"user__first_name",
"user__last_name",
)
list_filter = (
SoftDeleteListFilter,
"provider",
"email_verified",
"is_deleted",
"created_at",
)
readonly_fields = (
"id",
"created_at",
"updated_at",
"deleted_at",
)
autocomplete_fields = ("user",)
actions = (
"unlink_selected",
"hard_delete_selected",
"restore_selected",
)
@admin.action(description="Unlink selected social accounts")
def unlink_selected(self, request, queryset):
count = queryset.count()
with transaction.atomic():
queryset.hard_delete()
self.message_user(
request,
f"{count} social account link(s) permanently removed.",
level=messages.SUCCESS,
)