This commit is contained in:
2025-11-24 11:31:29 +09:00
parent ce7119e9e9
commit 1da6180658
30 changed files with 4352 additions and 272 deletions

View File

@@ -1,5 +1,9 @@
from django.shortcuts import render, get_object_or_404, redirect
from .models import Service, Project, Client, BlogPost, Review, Order, ServiceRequest, Category, AboutPage, FooterSettings, TeamMember
from .models import (
Service, Project, Client, BlogPost, Review, Order, ServiceRequest,
Category, AboutPage, FooterSettings, TeamMember,
NewsArticle, CareerVacancy, PortfolioItem, PrivacyPolicy, TermsOfUse
)
from django.db.models import Avg
from comunication.models import TelegramSettings
import qrcode
@@ -36,7 +40,28 @@ except Exception as e:
def home(request):
services = Service.objects.all()[:6] # Показываем только первые 6 услуг на главной
return render(request, 'web/home_modern.html', {'services': services})
# Последние посты блога
recent_blog_posts = BlogPost.objects.filter(status=BlogPost.PUBLISHED).order_by('-published_date')[:2]
# Последние новости
recent_news = NewsArticle.objects.filter(is_published=True).order_by('-published_date')[:2]
# Избранные проекты портфолио
featured_portfolio = PortfolioItem.objects.filter(featured=True, is_active=True)[:3]
# Количество активных вакансий
active_vacancies_count = CareerVacancy.objects.filter(is_active=True).count()
context = {
'services': services,
'recent_blog_posts': recent_blog_posts,
'recent_news': recent_news,
'featured_portfolio': featured_portfolio,
'active_vacancies_count': active_vacancies_count,
}
return render(request, 'web/home_modern.html', context)
def service_detail(request, pk):
service = get_object_or_404(Service, pk=pk)
@@ -353,3 +378,79 @@ def check_request_status(request, request_id):
except Exception as e:
logger.error(f"Ошибка при проверке статуса заявки {request_id}: {str(e)}")
return JsonResponse({'error': 'Ошибка сервера'}, status=500)
# ========== Blog Views ==========
def blog_list(request):
"""Список всех опубликованных постов блога"""
posts = BlogPost.objects.filter(status=BlogPost.PUBLISHED).order_by('-published_date')
return render(request, 'web/blog_list.html', {'posts': posts})
def blog_detail(request, slug):
"""Детальная страница поста блога"""
post = get_object_or_404(BlogPost, slug=slug, status=BlogPost.PUBLISHED)
post.views += 1
post.save(update_fields=['views'])
return render(request, 'web/blog_detail.html', {'post': post})
# ========== News Views ==========
def news_list(request):
"""Список всех опубликованных новостей"""
news = NewsArticle.objects.filter(is_published=True).order_by('-published_date')
return render(request, 'web/news_list.html', {'news': news})
def news_detail(request, slug):
"""Детальная страница новости"""
article = get_object_or_404(NewsArticle, slug=slug, is_published=True)
return render(request, 'web/news_detail.html', {'article': article})
# ========== Portfolio Views ==========
def portfolio_list(request):
"""Список всех активных элементов портфолио"""
category_id = request.GET.get('category')
items = PortfolioItem.objects.filter(is_active=True)
if category_id:
items = items.filter(category_id=category_id)
categories = Category.objects.all()
return render(request, 'web/portfolio_list.html', {
'items': items,
'categories': categories
})
def portfolio_detail(request, slug):
"""Детальная страница элемента портфолио"""
item = get_object_or_404(PortfolioItem, slug=slug, is_active=True)
return render(request, 'web/portfolio_detail.html', {'item': item})
# ========== Career Views ==========
def career_list(request):
"""Список всех активных вакансий"""
vacancies = CareerVacancy.objects.filter(is_active=True).order_by('-posted_at')
return render(request, 'web/career_list.html', {'vacancies': vacancies})
def career_detail(request, slug):
"""Детальная страница вакансии"""
vacancy = get_object_or_404(CareerVacancy, slug=slug, is_active=True)
return render(request, 'web/career_detail.html', {'vacancy': vacancy})
# ========== Legal Pages Views ==========
def privacy_policy(request):
"""Страница политики конфиденциальности"""
policy = PrivacyPolicy.objects.filter(is_active=True).first()
return render(request, 'web/privacy_policy.html', {'policy': policy})
def terms_of_use(request):
"""Страница условий использования"""
terms = TermsOfUse.objects.filter(is_active=True).first()
return render(request, 'web/terms_of_use.html', {'terms': terms})