diff --git a/apps/users/admin.py b/apps/users/admin.py index 9005ce9..d49de44 100644 --- a/apps/users/admin.py +++ b/apps/users/admin.py @@ -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, + )