/
dstemnik
/
DSServices
Обзор
Документация
Войти
/
dstemnik
/
DSServices
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
test_app/middleware.py
64 строки
3 KB
Tem
first commit
03 дек 2025, 11:03
03 дек 2025, 11:03
8cd0ecb
Код
Авторство
О чём код?
from django.utils.deprecation import MiddlewareMixin from accounts.models import AccountMembership from .models import WBStore, StoreAccess from .threadlocals import set_active_store class ActiveStoreMiddleware(MiddlewareMixin): """ Привязывает активный магазин к запросу и threadlocal. Логика: - если нет текущего аккаунта или пользователь не залогинен → магазина нет; - если пользователь админ аккаунта → он видит все магазины WBStore; - если пользователь менеджер → он видит только магазины из StoreAccess; - выбранный магазин берём из сессии, при необходимости подставляем первый доступный. """ def process_request(self, request): # 0. По умолчанию считаем, что магазин не выбран store = None # Для неавторизованных и для запросов без current_account if not request.user.is_authenticated or getattr(request, "current_account", None) is None: request.active_store = None set_active_store(None) return # Определяем, является ли пользователь администратором аккаунта is_admin = AccountMembership.objects.filter( user=request.user, account_id=request.current_account.id, is_active=True, account__is_active=True, role=AccountMembership.Role.ADMIN, ).exists() # Базовый queryset магазинов stores_qs = WBStore.objects.all() # Для менеджера — ограничиваем магазинами, к которым есть доступ if not is_admin: allowed_ids = StoreAccess.objects.filter( user=request.user, is_active=True, ).values_list("store_id", flat=True) stores_qs = stores_qs.filter(id__in=allowed_ids) # 1. Пытаемся взять активный магазин из сессии store_id = request.session.get("active_store_id") if store_id: store = stores_qs.filter(id=store_id).first() # 2. Если в сессии нет валидного магазина — выбираем первый доступный if store is None: first_store = stores_qs.order_by("id").first() if first_store is not None: request.session["active_store_id"] = first_store.id store = first_store # 3. Прокидываем магазин в request и threadlocal request.active_store = store set_active_store(store) # Ничего не возвращаем -> продолжаем обработку