From ddfbeba2f4f566cc486634ce946b58601f44d180 Mon Sep 17 00:00:00 2001 From: i701 Date: Wed, 26 Mar 2025 22:49:11 +0500 Subject: [PATCH] Refactor User model: update mobile field to allow null values, enforce unique id_card, and implement user filtering API endpoint --- api/migrations/0009_alter_user_mobile.py | 17 ++++++++++++++++ api/migrations/0010_alter_user_mobile.py | 17 ++++++++++++++++ api/migrations/0011_alter_user_email.py | 24 +++++++++++++++++++++++ api/migrations/0012_alter_user_id_card.py | 17 ++++++++++++++++ api/models.py | 5 ++--- api/urls.py | 4 ++-- api/views.py | 23 ++++++++++++++++++++++ 7 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 api/migrations/0009_alter_user_mobile.py create mode 100644 api/migrations/0010_alter_user_mobile.py create mode 100644 api/migrations/0011_alter_user_email.py create mode 100644 api/migrations/0012_alter_user_id_card.py diff --git a/api/migrations/0009_alter_user_mobile.py b/api/migrations/0009_alter_user_mobile.py new file mode 100644 index 0000000..e4df008 --- /dev/null +++ b/api/migrations/0009_alter_user_mobile.py @@ -0,0 +1,17 @@ +# Generated by Django 5.1.2 on 2025-03-24 10:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("api", "0008_alter_user_mobile"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="mobile", + field=models.CharField(blank=True, max_length=255, unique=True), + ), + ] diff --git a/api/migrations/0010_alter_user_mobile.py b/api/migrations/0010_alter_user_mobile.py new file mode 100644 index 0000000..06d49c6 --- /dev/null +++ b/api/migrations/0010_alter_user_mobile.py @@ -0,0 +1,17 @@ +# Generated by Django 5.1.2 on 2025-03-24 10:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("api", "0009_alter_user_mobile"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="mobile", + field=models.CharField(blank=True, max_length=255, null=True, unique=True), + ), + ] diff --git a/api/migrations/0011_alter_user_email.py b/api/migrations/0011_alter_user_email.py new file mode 100644 index 0000000..c3a5b05 --- /dev/null +++ b/api/migrations/0011_alter_user_email.py @@ -0,0 +1,24 @@ +# Generated by Django 5.1.2 on 2025-03-24 13:19 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("api", "0010_alter_user_mobile"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="email", + field=models.EmailField( + blank=True, + default=datetime.datetime(2025, 3, 24, 13, 19, 18, 477594), + max_length=254, + verbose_name="email address", + ), + preserve_default=False, + ), + ] diff --git a/api/migrations/0012_alter_user_id_card.py b/api/migrations/0012_alter_user_id_card.py new file mode 100644 index 0000000..d3d03f2 --- /dev/null +++ b/api/migrations/0012_alter_user_id_card.py @@ -0,0 +1,17 @@ +# Generated by Django 5.1.2 on 2025-03-26 17:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("api", "0011_alter_user_email"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="id_card", + field=models.CharField(blank=True, max_length=255, unique=True), + ), + ] diff --git a/api/models.py b/api/models.py index 9255b3f..7bbf148 100644 --- a/api/models.py +++ b/api/models.py @@ -9,12 +9,11 @@ from django.utils import timezone class User(AbstractUser): - email = models.EmailField(unique=True, blank=True, null=True) address = models.CharField(max_length=255, blank=True) - mobile = models.CharField(max_length=255, blank=True, unique=True, default=0) + mobile = models.CharField(max_length=255, blank=True, unique=True, null=True) designation = models.CharField(max_length=255, blank=True) acc_no = models.CharField(max_length=255, blank=True) - id_card = models.CharField(max_length=255, blank=True) + id_card = models.CharField(max_length=255, blank=True, unique=True) verified = models.BooleanField(default=False) dob = models.DateField(blank=True, null=True) terms_accepted = models.BooleanField(default=False) diff --git a/api/urls.py b/api/urls.py index 24389da..2e04e20 100644 --- a/api/urls.py +++ b/api/urls.py @@ -16,7 +16,7 @@ from .views import ( RetrieveUpdateDestroyAtollView, ListCreateIslandView, RetrieveUpdateDestroyIslandView, - ListUserByIDCardView, + filter_user, ) @@ -30,7 +30,7 @@ urlpatterns = [ # path("auth/", CustomAuthToken.as_view()), path("users/", ListUserView.as_view(), name="users"), path("users//", UserDetailAPIView.as_view(), name="user-detail"), - path("users/idcard/", ListUserByIDCardView.as_view(), name="users-idcard"), + path("users/filter/", filter_user, name="filter-users"), path("healthcheck/", healthcheck, name="healthcheck"), path("test/", test_email, name="testemail"), path("atolls/", ListAtollView.as_view(), name="atolls"), diff --git a/api/views.py b/api/views.py index a2c5dc7..43e635a 100644 --- a/api/views.py +++ b/api/views.py @@ -20,6 +20,7 @@ from django_filters.rest_framework import DjangoFilterBackend import re from typing import cast, Dict, Any from django.core.mail import send_mail +from django.db.models import Q # local apps import from .serializers import ( @@ -196,6 +197,28 @@ class ListUserView(StaffEditorPermissionMixin, generics.ListAPIView): queryset = User.objects.all() +@api_view(["GET"]) +def filter_user(request): + id_card = request.GET.get("id_card", "").strip() or None + mobile = request.GET.get("mobile", "").strip() or None + + if not id_card and not mobile: + return Response({"ok": False}) + + filters = Q() + if id_card is not None: + filters |= Q(id_card=id_card) + if mobile is not None: + filters |= Q(mobile=mobile) + + user = User.objects.filter(filters).first() + + print(f"Querying with filters: {filters}") + print(f"Found user: {user}") + + return Response({"ok": True if user else False}) + + class ListUserByIDCardView(generics.ListAPIView): # Create user API view permission_classes = (permissions.AllowAny,)