diff --git a/myproject/accounts/models.py b/myproject/accounts/models.py index d835b75..97a10a9 100644 --- a/myproject/accounts/models.py +++ b/myproject/accounts/models.py @@ -75,6 +75,11 @@ class CustomUser(AbstractBaseUser): def __str__(self): return self.email + @property + def display_name(self): + """Отображаемое имя пользователя: имя если есть, иначе email""" + return self.name or self.email + def has_perm(self, perm, obj=None): """ Проверка разрешения через authentication backends. diff --git a/myproject/pos/views.py b/myproject/pos/views.py index 4cb0857..31a2bba 100644 --- a/myproject/pos/views.py +++ b/myproject/pos/views.py @@ -4,7 +4,7 @@ from django.contrib.auth.decorators import login_required from django.http import JsonResponse from django.views.decorators.http import require_http_methods 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.utils import timezone from django.core.exceptions import ValidationError @@ -454,10 +454,18 @@ def get_showcase_kits_api(request): product_kit_id__in=kit_ids, cart_lock_expires_at__gt=timezone.now(), 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', 'locked_by_user_id', - 'locked_by_user__username', + 'locked_by_user_display', '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 kit['is_locked'] = True 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() else: kit['is_locked'] = False