fix(pos): исправить загрузку витринных комплектов
- Добавить display_name в CustomUser (name или email) - Исправить get_showcase_kits_api: заменить username на display_name - Использовать Case/When с output_field для выбора имени на уровне БД Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -75,6 +75,11 @@ class CustomUser(AbstractBaseUser):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.email
|
return self.email
|
||||||
|
|
||||||
|
@property
|
||||||
|
def display_name(self):
|
||||||
|
"""Отображаемое имя пользователя: имя если есть, иначе email"""
|
||||||
|
return self.name or self.email
|
||||||
|
|
||||||
def has_perm(self, perm, obj=None):
|
def has_perm(self, perm, obj=None):
|
||||||
"""
|
"""
|
||||||
Проверка разрешения через authentication backends.
|
Проверка разрешения через authentication backends.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from django.contrib.auth.decorators import login_required
|
|||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
from django.views.decorators.http import require_http_methods
|
from django.views.decorators.http import require_http_methods
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.db.models import Prefetch, OuterRef, Subquery, DecimalField
|
from django.db.models import Prefetch, OuterRef, Subquery, DecimalField, F, Case, When, CharField
|
||||||
from django.db.models.functions import Coalesce
|
from django.db.models.functions import Coalesce
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
@@ -454,10 +454,18 @@ def get_showcase_kits_api(request):
|
|||||||
product_kit_id__in=kit_ids,
|
product_kit_id__in=kit_ids,
|
||||||
cart_lock_expires_at__gt=timezone.now(),
|
cart_lock_expires_at__gt=timezone.now(),
|
||||||
status='reserved'
|
status='reserved'
|
||||||
).select_related('locked_by_user').values(
|
).select_related('locked_by_user').annotate(
|
||||||
|
# На уровне БД выбираем: если name есть - берем name, иначе email
|
||||||
|
locked_by_user_display=Case(
|
||||||
|
When(locked_by_user__name__isnull=False, then=F('locked_by_user__name')),
|
||||||
|
When(locked_by_user__name='', then=F('locked_by_user__email')),
|
||||||
|
default=F('locked_by_user__email'),
|
||||||
|
output_field=CharField()
|
||||||
|
)
|
||||||
|
).values(
|
||||||
'product_kit_id',
|
'product_kit_id',
|
||||||
'locked_by_user_id',
|
'locked_by_user_id',
|
||||||
'locked_by_user__username',
|
'locked_by_user_display',
|
||||||
'cart_lock_expires_at'
|
'cart_lock_expires_at'
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -476,7 +484,7 @@ def get_showcase_kits_api(request):
|
|||||||
is_locked_by_me = lock_info['locked_by_user_id'] == request.user.id
|
is_locked_by_me = lock_info['locked_by_user_id'] == request.user.id
|
||||||
kit['is_locked'] = True
|
kit['is_locked'] = True
|
||||||
kit['locked_by_me'] = is_locked_by_me
|
kit['locked_by_me'] = is_locked_by_me
|
||||||
kit['locked_by_user'] = lock_info['locked_by_user__username']
|
kit['locked_by_user'] = lock_info['locked_by_user_display']
|
||||||
kit['lock_expires_at'] = lock_info['cart_lock_expires_at'].isoformat()
|
kit['lock_expires_at'] = lock_info['cart_lock_expires_at'].isoformat()
|
||||||
else:
|
else:
|
||||||
kit['is_locked'] = False
|
kit['is_locked'] = False
|
||||||
|
|||||||
Reference in New Issue
Block a user