from django.http import HttpResponse, HttpResponseNotFound from .models import * from django.shortcuts import render, redirect from django.contrib import messages from .models import CallbackRequest # Импортируем из models, а не forms from .forms import CallbackForm from django.utils import timezone from datetime import timedelta from .models import PageView, Visitor from django.db.models import Count from django.contrib.auth.decorators import login_required, user_passes_test from django.views.decorators.http import require_GET menu = [ {'title': "Главная", 'url_name': 'home'}, {'title': "Проекты", 'url_name': 'solution'}, {'title': "Компетенции", 'url_name': 'ability'}, {'title': "Отзывы", 'url_name': 'recall'}, {'title': "Обо мне", 'url_name': 'about'} ] # === ДОБАВЬТЕ ЭТИ ФУНКЦИИ ЗДЕСЬ === def get_client_ip(request): """Получаем реальный IP клиента""" x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') return ip def should_track_request(request): """Определяем, нужно ли отслеживать запрос""" client_ip = get_client_ip(request) path = request.path # Игнорируемые пути (Nextcloud специфичные) nextcloud_paths = [ '/index.php', '/status.php', '/cron', '/remote.php', '/ocs', '/apps/', '/custom_apps/', ] # Игнорируемые IP (Docker сети) docker_ips = [ '192.168.64.1', '192.168.65.1', '172.17.0.1', '172.18.0.1', '172.19.0.1', ] # Игнорируем статические файлы и админку if path.startswith('/static/') or path.startswith('/admin/'): return False # Не отслеживаем Nextcloud и Docker запросы if any(path.startswith(p) for p in nextcloud_paths): return False if client_ip in docker_ips: return False return True def track_page_view(request): """Основная функция отслеживания просмотров""" if not should_track_request(request): return try: PageView.objects.create( url=request.path, ip_address=get_client_ip(request), user_agent=request.META.get('HTTP_USER_AGENT', '')[:500], referer=request.META.get('HTTP_REFERER', '')[:500], ) except Exception as e: print(f"Error tracking page: {e}") def track_view(view_func): """Декоратор для отслеживания просмотров страниц""" from functools import wraps @wraps(view_func) def _wrapped_view(request, *args, **kwargs): # Отслеживаем просмотр перед выполнением view track_page_view(request) return view_func(request, *args, **kwargs) return _wrapped_view @track_view def index(request): posts = Home.objects.filter(is_published=True) context = { 'posts': posts, 'menu': menu, 'title': "Главная страница", 'meta_description': "Профессиональный программист 1С с более чем 10-летним опытом. Разработка, интеграция и оптимизация систем 1С. Закажите консультацию.", 'meta_keywords': "программист 1С, разработка 1С, интеграция 1С, оптимизация 1С, 1С предприятие 8.3", 'form': CallbackForm() } return render(request, 'programmer/index.html', context=context) @track_view def about(request): context = { 'menu': menu, 'title': "Обо мне - Программист 1С", 'meta_description': "Николай Сердюк - профессиональный программист 1С с более чем 10-летним опытом. Разработка, интеграция, оптимизация бизнес-процессов.", 'meta_keywords': "программист 1С Николай Сердюк, опыт работы 1С, компетенции 1С, проекты 1С" } return render(request, 'programmer/about.html', context=context) @track_view def solution(request): posts = Solution.objects.filter(is_published=True) context = { 'posts': posts, 'menu': menu, 'title': "Проекты" } return render(request, 'programmer/solution.html', context=context) @track_view def ability(request): posts = Competence.objects.filter(is_published=True) context = { 'posts': posts, 'menu': menu, 'title': "Компетенции" } return render(request, 'programmer/competence.html', context=context) @track_view def recall(request): posts = Recall.objects.filter(is_published=True) context = { 'posts': posts, 'menu': menu, 'title': "Отзывы" } return render(request, 'programmer/recall.html', context=context) def show_post(request, post_id): return HttpResponse(f"Отображение № {post_id}") def pageNotFound(request, exception): return HttpResponseNotFound('