From e7836ebf90616d0e5ca8d62d1e62bd48e4a39847 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 10 Jun 2025 06:30:45 +0300 Subject: [PATCH] Fixes: add unregistered addresses fix --- core/admin.py | 3 +- vibes_auth/managers.py | 126 ++++++++++++++++++++++++----------------- 2 files changed, 77 insertions(+), 52 deletions(-) diff --git a/core/admin.py b/core/admin.py index 69aa20e8..c6811704 100644 --- a/core/admin.py +++ b/core/admin.py @@ -19,6 +19,7 @@ from .models import ( AttributeValue, Brand, Category, + CategoryTag, Feedback, Order, OrderProduct, @@ -29,7 +30,7 @@ from .models import ( Promotion, Stock, Vendor, - Wishlist, CategoryTag, + Wishlist, ) diff --git a/vibes_auth/managers.py b/vibes_auth/managers.py index 779a7763..2ba749f6 100644 --- a/vibes_auth/managers.py +++ b/vibes_auth/managers.py @@ -1,65 +1,89 @@ +import logging +import traceback + from django.contrib import auth from django.contrib.auth.base_user import BaseUserManager from django.contrib.auth.hashers import make_password -from core.models import Order +from core.models import Address, Order + +logger = logging.getLogger(__name__) class UserManager(BaseUserManager): use_in_migrations = True - def _create_user(self, email, password, **extra_fields): - email = self.normalize_email(email) - user = self.model(email=email, **extra_fields) - user.password = make_password(password) - user.save(using=self._db) - for order in Order.objects.filter(attributes__icontains=user.email): - if not order.user: - order.user = user - order.save() - for order in Order.objects.filter(attributes__icontains=user.phone_number): - if not order.user: - order.user = user - order.save() - return user + @staticmethod + def handle_unregistered_entities(user): + try: + orders = set() + for order in Order.objects.filter(attributes__icontains=user.email): + if not order.user: + order.user = user + order.save() + orders.add(order.uuid) + for order in Order.objects.filter(attributes__icontains=user.phone_number): + if not order.user: + order.user = user + order.save() + orders.add(order.uuid) + for address in Address.objects.filter(billing_address_order__in=orders): + if not address.user: + address.user = user + address.save() + for address in Address.objects.filter(shipping_address_order__in=orders): + if not address.user: + address.user = user + address.save() + except Exception as e: + logger.error(e) + logger.error(traceback.format_exc()) - def create_user(self, email=None, password=None, **extra_fields): - extra_fields.setdefault("is_staff", False) - extra_fields.setdefault("is_superuser", False) - return self._create_user(email, password, **extra_fields) + def _create_user(self, email, password, **extra_fields): + email = self.normalize_email(email) + user = self.model(email=email, **extra_fields) + user.password = make_password(password) + user.save(using=self._db) + self.handle_unregistered_entities(user) + return user - def create_superuser(self, email=None, password=None, **extra_fields): - extra_fields.setdefault("is_staff", True) - extra_fields.setdefault("is_superuser", True) - if extra_fields.get("is_staff") is not True: - raise ValueError("Superuser must have is_staff=True.") - if extra_fields.get("is_superuser") is not True: - raise ValueError("Superuser must have is_superuser=True.") - user = self._create_user(email, password, **extra_fields) - user.is_active = True - user.is_verified = True - user.save() - return user + def create_user(self, email=None, password=None, **extra_fields): + extra_fields.setdefault("is_staff", False) + extra_fields.setdefault("is_superuser", False) + return self._create_user(email, password, **extra_fields) - def with_perm(self, perm, is_active=True, include_superusers=True, backend=None, obj=None): - if backend is None: - backends = auth._get_backends(return_tuples=True) - if len(backends) == 1: - backend, _ = backends[0] + def create_superuser(self, email=None, password=None, **extra_fields): + extra_fields.setdefault("is_staff", True) + extra_fields.setdefault("is_superuser", True) + if extra_fields.get("is_staff") is not True: + raise ValueError("Superuser must have is_staff=True.") + if extra_fields.get("is_superuser") is not True: + raise ValueError("Superuser must have is_superuser=True.") + user = self._create_user(email, password, **extra_fields) + user.is_active = True + user.is_verified = True + user.save() + return user + + def with_perm(self, perm, is_active=True, include_superusers=True, backend=None, obj=None): + if backend is None: + backends = auth._get_backends(return_tuples=True) + if len(backends) == 1: + backend, _ = backends[0] + else: + raise ValueError( + "You have multiple authentication backends configured and " + "therefore must provide the `backend` argument." + ) + elif not isinstance(backend, str): + raise TypeError(f"backend must be a dotted import path string (got {backend}).") else: - raise ValueError( - "You have multiple authentication backends configured and " - "therefore must provide the `backend` argument." + backend = auth.load_backend(backend) + if hasattr(backend, "with_perm"): + return backend.with_perm( + perm, + is_active=is_active, + include_superusers=include_superusers, + obj=obj, ) - elif not isinstance(backend, str): - raise TypeError(f"backend must be a dotted import path string (got {backend}).") - else: - backend = auth.load_backend(backend) - if hasattr(backend, "with_perm"): - return backend.with_perm( - perm, - is_active=is_active, - include_superusers=include_superusers, - obj=obj, - ) - return self.none() + return self.none()