74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
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
|
||
|
||
|