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:
2026-01-19 00:15:11 +03:00
parent 017fa4b744
commit 1b749ebe63
2 changed files with 17 additions and 4 deletions

View File

@@ -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.

View File

@@ -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