Fixes: add unregistered addresses fix

This commit is contained in:
Egor Pavlovich Gorbunov 2025-06-10 06:30:45 +03:00
parent 8a00cd2bff
commit e7836ebf90
2 changed files with 77 additions and 52 deletions

View file

@ -19,6 +19,7 @@ from .models import (
AttributeValue, AttributeValue,
Brand, Brand,
Category, Category,
CategoryTag,
Feedback, Feedback,
Order, Order,
OrderProduct, OrderProduct,
@ -29,7 +30,7 @@ from .models import (
Promotion, Promotion,
Stock, Stock,
Vendor, Vendor,
Wishlist, CategoryTag, Wishlist,
) )

View file

@ -1,65 +1,89 @@
import logging
import traceback
from django.contrib import auth from django.contrib import auth
from django.contrib.auth.base_user import BaseUserManager from django.contrib.auth.base_user import BaseUserManager
from django.contrib.auth.hashers import make_password 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): class UserManager(BaseUserManager):
use_in_migrations = True use_in_migrations = True
def _create_user(self, email, password, **extra_fields): @staticmethod
email = self.normalize_email(email) def handle_unregistered_entities(user):
user = self.model(email=email, **extra_fields) try:
user.password = make_password(password) orders = set()
user.save(using=self._db) for order in Order.objects.filter(attributes__icontains=user.email):
for order in Order.objects.filter(attributes__icontains=user.email): if not order.user:
if not order.user: order.user = user
order.user = user order.save()
order.save() orders.add(order.uuid)
for order in Order.objects.filter(attributes__icontains=user.phone_number): for order in Order.objects.filter(attributes__icontains=user.phone_number):
if not order.user: if not order.user:
order.user = user order.user = user
order.save() order.save()
return user 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): def _create_user(self, email, password, **extra_fields):
extra_fields.setdefault("is_staff", False) email = self.normalize_email(email)
extra_fields.setdefault("is_superuser", False) user = self.model(email=email, **extra_fields)
return self._create_user(email, password, **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): def create_user(self, email=None, password=None, **extra_fields):
extra_fields.setdefault("is_staff", True) extra_fields.setdefault("is_staff", False)
extra_fields.setdefault("is_superuser", True) extra_fields.setdefault("is_superuser", False)
if extra_fields.get("is_staff") is not True: return self._create_user(email, password, **extra_fields)
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): def create_superuser(self, email=None, password=None, **extra_fields):
if backend is None: extra_fields.setdefault("is_staff", True)
backends = auth._get_backends(return_tuples=True) extra_fields.setdefault("is_superuser", True)
if len(backends) == 1: if extra_fields.get("is_staff") is not True:
backend, _ = backends[0] 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: else:
raise ValueError( backend = auth.load_backend(backend)
"You have multiple authentication backends configured and " if hasattr(backend, "with_perm"):
"therefore must provide the `backend` argument." return backend.with_perm(
perm,
is_active=is_active,
include_superusers=include_superusers,
obj=obj,
) )
elif not isinstance(backend, str): return self.none()
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()