151 lines
4.5 KiB
Python
151 lines
4.5 KiB
Python
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
|
||
|
||
|
||
menu = [
|
||
{'title': "Главная", 'url_name': 'home'},
|
||
{'title': "Проекты", 'url_name': 'solution'},
|
||
{'title': "Компетенции", 'url_name': 'ability'},
|
||
{'title': "Отзывы", 'url_name': 'recall'},
|
||
{'title': "Обо мне", 'url_name': 'about'}
|
||
]
|
||
|
||
|
||
def index(request):
|
||
posts = Home.objects.filter(is_published=True)
|
||
context = {
|
||
'posts': posts,
|
||
'menu': menu,
|
||
'title': "Главная страница",
|
||
'form': CallbackForm()
|
||
}
|
||
return render(request, 'programmer/index.html', context=context)
|
||
|
||
|
||
def about(request):
|
||
context = {
|
||
'menu': menu,
|
||
'title': "Обо мне"
|
||
}
|
||
return render(request, 'programmer/about.html', context=context)
|
||
|
||
|
||
def solution(request):
|
||
posts = Solution.objects.filter(is_published=True)
|
||
context = {
|
||
'posts': posts,
|
||
'menu': menu,
|
||
'title': "Проекты"
|
||
}
|
||
return render(request, 'programmer/solution.html', context=context)
|
||
|
||
|
||
def ability(request):
|
||
posts = Competence.objects.filter(is_published=True)
|
||
context = {
|
||
'posts': posts,
|
||
'menu': menu,
|
||
'title': "Компетенции"
|
||
}
|
||
return render(request, 'programmer/competence.html', context=context)
|
||
|
||
|
||
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('<h1>Страница не найдена</h1>')
|
||
|
||
|
||
def callback_request(request):
|
||
if request.method == 'POST':
|
||
form = CallbackForm(request.POST)
|
||
if form.is_valid():
|
||
# Сохраняем заявку через форму
|
||
form.save()
|
||
messages.success(request, '✅ Ваша заявка успешно отправлена! Я свяжусь с вами в ближайшее время.')
|
||
return redirect('home')
|
||
else:
|
||
# Если форма невалидна, показываем ошибки
|
||
for field, errors in form.errors.items():
|
||
for error in errors:
|
||
messages.error(request, f'❌ Ошибка в поле {form.fields[field].label}: {error}')
|
||
return redirect('home')
|
||
|
||
# Если GET запрос, просто показываем главную страницу
|
||
return redirect('home')
|
||
|
||
|
||
def is_admin(user):
|
||
return user.is_staff
|
||
|
||
|
||
def is_staff(user):
|
||
return user.is_staff
|
||
|
||
|
||
@login_required
|
||
@user_passes_test(is_staff)
|
||
def statistics_view(request):
|
||
today = timezone.now().date()
|
||
week_ago = today - timedelta(days=7)
|
||
|
||
# Статистика за сегодня
|
||
today_views = PageView.objects.filter(
|
||
timestamp__date=today
|
||
).count()
|
||
|
||
# Статистика за неделю
|
||
weekly_views = PageView.objects.filter(
|
||
timestamp__date__gte=week_ago
|
||
).count()
|
||
|
||
# Всего просмотров
|
||
total_views = PageView.objects.count()
|
||
|
||
# Популярные страницы за неделю
|
||
popular_pages = PageView.objects.filter(
|
||
timestamp__date__gte=week_ago
|
||
).values('url').annotate(
|
||
views=Count('id')
|
||
).order_by('-views')[:10]
|
||
|
||
# Уникальные посетители за неделю
|
||
unique_visitors = Visitor.objects.filter(
|
||
last_visit__date__gte=week_ago
|
||
).count()
|
||
|
||
# Последние посещения
|
||
recent_views = PageView.objects.select_related().order_by('-timestamp')[:20]
|
||
|
||
context = {
|
||
'today_views': today_views,
|
||
'weekly_views': weekly_views,
|
||
'total_views': total_views,
|
||
'unique_visitors': unique_visitors,
|
||
'popular_pages': popular_pages,
|
||
'recent_views': recent_views,
|
||
}
|
||
|
||
return render(request, 'admin/statistics.html', context)
|