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.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import SetPasswordForm
from django.db import transaction
from django.shortcuts import redirect
from django.template.response import TemplateResponse
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 apps.users.models import UserSocialAccount
from apps.users.services.forms import CustomUserChangeForm, CustomUserCreationForm
User = get_user_model()
@@ -21,6 +23,34 @@ class UserResource(resources.ModelResource):
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)
class CustomUserAdmin(BaseUserAdmin, BaseAdmin):
model = User
@@ -136,6 +166,7 @@ class CustomUserAdmin(BaseUserAdmin, BaseAdmin):
),
)
filter_horizontal = ("groups", "user_permissions")
inlines = (UserSocialAccountInline,)
actions_row = [
"reset_password_action",
@@ -181,3 +212,53 @@ class CustomUserAdmin(BaseUserAdmin, BaseAdmin):
@admin.action(description="Deactivate selected users")
def deactivate_users(self, request, queryset):
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,
)