feat(user): update user verification process to utilize TemporaryUser model and include verification status in response
All checks were successful
Build and Push Docker Images / Build and Push Docker Images (push) Successful in 5m54s

This commit is contained in:
2025-08-02 13:38:47 +05:00
parent 64bba25fb9
commit 85485ae351
2 changed files with 40 additions and 34 deletions

View File

@@ -1,6 +1,6 @@
# pyright: reportGeneralTypeIssues=false # pyright: reportGeneralTypeIssues=false
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from api.models import User from api.models import TemporaryUser
from devices.models import Device from devices.models import Device
from api.notifications import send_sms from api.notifications import send_sms
import os import os
@@ -146,12 +146,12 @@ def verify_user_with_person_api_task(user_id: int):
if not user_id: if not user_id:
logger.error("User ID is not provided.") logger.error("User ID is not provided.")
return None return None
user = get_object_or_404(User, id=user_id) t_user = get_object_or_404(TemporaryUser, id=user_id)
if not user: if not t_user:
logger.error(f"User with ID {user_id} not found.") logger.error(f"User with ID {user_id} not found.")
return None return None
verification_failed_message = f"""*The following user verification failed*:\n\n*ID Card:* {user.id_card}\n*Name:* {user.first_name} {user.last_name}\n*House Name:* {user.address}\n*Date of Birth:* {user.dob}\n*Island:* {(user.atoll.name if user.atoll else "N/A")} {(user.island.name if user.island else "N/A")}\n*Mobile:* {user.mobile}\nVisit [SAR Link Portal](https://portal.sarlink.net/users/{user_id}/details) to manually verify this user. verification_failed_message = f"""*The following user verification failed*:\n\n*ID Card:* {t_user.t_id_card}\n*Name:* {t_user.t_first_name} {t_user.t_last_name}\n*House Name:* {t_user.t_address}\n*Date of Birth:* {t_user.t_dob}\n*Island:* {(t_user.t_atoll.name if t_user.t_atoll else "N/A")} {(t_user.t_island.name if t_user.t_island else "N/A")}\n*Mobile:* {t_user.t_mobile}\nVisit [SAR Link Portal](https://portal.sarlink.net/users/{user_id}/details) to manually verify this user.
""" """
# logger.info(verification_failed_message) # logger.info(verification_failed_message)
@@ -163,7 +163,7 @@ def verify_user_with_person_api_task(user_id: int):
) )
import requests import requests
response = requests.get(f"{PERSON_VERIFY_BASE_URL}/api/person/{user.id_card}") response = requests.get(f"{PERSON_VERIFY_BASE_URL}/api/person/{t_user.id_card}")
if response.status_code == 200: if response.status_code == 200:
data = response.json() data = response.json()
api_nic = data.get("nic") api_nic = data.get("nic")
@@ -173,10 +173,10 @@ def verify_user_with_person_api_task(user_id: int):
api_atoll = data.get("atoll_en") api_atoll = data.get("atoll_en")
api_island_name = data.get("island_name_en") api_island_name = data.get("island_name_en")
if not user.mobile or user.dob is None: if not t_user.mobile or t_user.dob is None:
logger.error("User mobile or date of birth is not set.") logger.error("User mobile or date of birth is not set.")
return None return None
if not user.island or user.atoll is None: if not t_user.island or t_user.atoll is None:
logger.error("User island or atoll is not set.") logger.error("User island or atoll is not set.")
return None return None
@@ -187,51 +187,53 @@ def verify_user_with_person_api_task(user_id: int):
logger.info(f"API atoll: {api_atoll}") logger.info(f"API atoll: {api_atoll}")
logger.info(f"API island name: {api_island_name}") logger.info(f"API island name: {api_island_name}")
user_nic = user.id_card user_nic = t_user.t_id_card
user_name = f"{user.first_name} {user.last_name}" user_name = f"{t_user.t_first_name} {t_user.t_last_name}"
user_house_name = user.address user_house_name = t_user.t_address
user_dob = user.dob.isoformat() user_dob = t_user.t_dob.isoformat()
logger.info(f"User nic: {user_nic}") logger.info(f"User nic: {user_nic}")
logger.info(f"User name: {user_name}") logger.info(f"User name: {user_name}")
logger.info(f"User house name: {user_house_name}") logger.info(f"User house name: {user_house_name}")
logger.info(f"User dob: {user_dob}") logger.info(f"User dob: {user_dob}")
logger.info(f"User atoll: {user.atoll}") logger.info(f"User atoll: {t_user.t_atoll.name if t_user.t_atoll else 'N/A'}")
logger.info(f"User island name: {user.island}") logger.info(
f"User island name: {t_user.t_island.name if t_user.t_island else 'N/A'}"
)
logger.info( logger.info(
f"case User atoll: {user.atoll.name == api_atoll.strip() if api_atoll else False}" f"case User atoll: {t_user.t_atoll.name == api_atoll.strip() if api_atoll else False}"
) # Defensive check for api_atoll ) # Defensive check for api_atoll
logger.info(f"api atoll type: {type(api_atoll)}") logger.info(f"api atoll type: {type(api_atoll)}")
logger.info(f"user atoll type: {type(user.atoll.name)}") logger.info(f"user atoll type: {type(t_user.t_atoll.name)}")
logger.info( logger.info(
f"case User island name: {user.island.name == api_island_name.strip() if api_island_name else False}" f"case User island name: {t_user.t_island.name == api_island_name.strip() if api_island_name else False}"
) # Defensive check for api_island_name ) # Defensive check for api_island_name
logger.info(f"api island name type: {type(api_island_name)}") logger.info(f"api island name type: {type(api_island_name)}")
logger.info(f"user island name type: {type(user.island.name)}") logger.info(f"user island name type: {type(t_user.t_island.name)}")
if ( if (
data.get("nic") == user.id_card data.get("nic") == t_user.t_id_card
and data.get("name_en") == f"{user.first_name} {user.last_name}" and data.get("name_en") == f"{t_user.t_first_name} {t_user.t_last_name}"
and data.get("house_name_en") == user.address and data.get("house_name_en") == t_user.t_address
and data.get("dob").split("T")[0] == user.dob.isoformat() and data.get("dob").split("T")[0] == t_user.t_dob.isoformat()
and data.get("atoll_en").strip() == user.atoll.name and data.get("atoll_en").strip() == t_user.t_atoll.name
and data.get("island_name_en").strip() == user.island.name and data.get("island_name_en").strip() == t_user.t_island.name
): ):
user.verified = True t_user.verified = True
user.save() t_user.save()
send_sms( send_sms(
user.mobile, t_user.t_mobile,
f"Dear {user.first_name} {user.last_name}, \n\nYour account has been successfully verified. \n\nYou can now manage your devices and make payments through our portal at https://portal.sarlink.net. \n\n - SAR Link", f"Dear {t_user.t_first_name} {t_user.t_last_name}, \n\nYour account has been successfully verified. \n\nYou can now manage your devices and make payments through our portal at https://portal.sarlink.net. \n\n - SAR Link",
) )
return True return True
else: else:
user.verified = False t_user.verified = False
user.save() t_user.save()
send_sms( send_sms(
user.mobile, t_user.t_mobile,
f"Dear {user.first_name} {user.last_name}, \n\nYour account registration is being processed. \n\nWe will notify you once verification is complete. \n\n - SAR Link", f"Dear {t_user.t_first_name} {t_user.t_last_name}, \n\nYour account registration is being processed. \n\nWe will notify you once verification is complete. \n\n - SAR Link",
) )
# send_clean_telegram_markdown(message=verification_failed_message) # send_clean_telegram_markdown(message=verification_failed_message)

View File

@@ -550,15 +550,19 @@ def filter_temporary_user(request):
elif mobile: elif mobile:
filters |= Q(t_mobile=mobile) filters |= Q(t_mobile=mobile)
user = TemporaryUser.objects.only("t_id", "otp_verified").filter(filters).first() user = (
TemporaryUser.objects.only("t_id", "otp_verified", "t_verified")
.filter(filters)
.first()
)
print(f"Querying with filters: {filters}") print(f"Querying with filters: {filters}")
print(f"Found temporary user: {user}") print(f"Found temporary user: {user}")
return Response( return Response(
{"ok": True, "otp_verified": user.otp_verified} {"ok": True, "otp_verified": user.otp_verified, "t_verified": user.t_verified}
if user if user
else {"ok": False, "otp_verified": False} else {"ok": False, "otp_verified": False, "t_verified": False}
) )