from typing import Any, Dict from django.views.generic.base import ContextMixin from .services import track_page_view class PageViewTrackingMixin(ContextMixin): """ Миксин для отслеживания просмотров страниц. Добавляет трекинг при вызове view. """ def dispatch(self, request, *args, **kwargs): # Отслеживаем просмотр перед обработкой запроса track_page_view(request) return super().dispatch(request, *args, **kwargs) class MenuContextMixin(ContextMixin): """ Миксин для добавления меню в контекст. """ def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: context = super().get_context_data(**kwargs) # Основное меню (всегда) main_menu = [ {'title': "Главная", 'url_name': 'home'}, {'title': "Проекты", 'url_name': 'solution'}, {'title': "Статьи", 'url_name': 'blog'}, {'title': "Отзывы", 'url_name': 'recall'}, {'title': "Обо мне", 'url_name': 'about'}, ] # Пользовательское меню (зависит от статуса) if self.request.user.is_authenticated: user_menu = [ {'title': "Профиль", 'url_name': 'profile'}, {'title': "Выйти", 'url_name': 'logout'}, # будет обработан как форма ] else: user_menu = [ {'title': "Войти", 'url_name': 'login'}, {'title': "Регистрация", 'url_name': 'register'}, ] context['main_menu'] = main_menu context['user_menu'] = user_menu return context class BreadcrumbMixin(ContextMixin): """ Миксин для добавления хлебных крошек в контекст. В дочерних классах нужно определить метод get_breadcrumbs(). """ breadcrumbs = None def get_breadcrumbs(self): """ Должен возвращать список словарей: [{'title': 'Название', 'url_name': 'url_name', 'url_args': [...], 'url_kwargs': {...}}, ...] Последний элемент без url_name (текущая страница). """ if self.breadcrumbs is not None: return self.breadcrumbs return [] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['breadcrumbs'] = self.get_breadcrumbs() return context