From 38d80709db3fa7ccb0922b5c9f34a5695a56dc2d Mon Sep 17 00:00:00 2001 From: i701 Date: Sun, 8 Jun 2025 14:32:30 +0500 Subject: [PATCH] Enhance UserAdmin save logic to auto-generate email from mobile or user ID; improve token creation logging and user existence check --- api/admin.py | 11 +++++++++++ djangopasswordlessknox/utils.py | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/api/admin.py b/api/admin.py index 99ae6b2..0c19531 100644 --- a/api/admin.py +++ b/api/admin.py @@ -1,5 +1,8 @@ +from typing import Any from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin +from django.forms.models import ModelForm +from django.http.request import HttpRequest from api.models import User, Atoll, Island, TemporaryUser from django.contrib.auth.models import Permission @@ -63,6 +66,14 @@ class UserAdmin(BaseUserAdmin): ("Important dates", {"fields": ("last_login", "date_joined")}), ) + def save_model(self, request, obj, form, change): + if not obj.email: + if obj.mobile: + obj.email = f"{obj.mobile}@sarlink.net" + else: + obj.email = f"user_{obj.pk or 'new'}@sarlink.net" + super().save_model(request, obj, form, change) + class TemporaryUserAdmin(admin.ModelAdmin): list_display = ( diff --git a/djangopasswordlessknox/utils.py b/djangopasswordlessknox/utils.py index 529b064..7fb7a6a 100644 --- a/djangopasswordlessknox/utils.py +++ b/djangopasswordlessknox/utils.py @@ -44,6 +44,29 @@ def authenticate_by_token(callback_token): def create_callback_token_for_user(user, token_type): + logger.info( + f"Attempting to create token for user: {user}, user.pk: {user.pk if user else 'None'}" + ) + if user and user.pk: + try: + # Explicitly check if the user exists in the database + User.objects.get(pk=user.pk) + logger.info( + f"User with pk {user.pk} confirmed to exist in DB before token creation." + ) + except User.DoesNotExist: + logger.error( + f"CRITICAL: User with pk {user.pk} DOES NOT EXIST in DB right before token creation for {user}!" + ) + return None + # You might want to return None or raise an exception here to prevent the IntegrityError + # For example: return None + else: + logger.error( + f"CRITICAL: Invalid user object passed to create_callback_token_for_user: {user}" + ) + # return None + token = None token_type = token_type.upper()