Files
santeh-ray/home/views.py
Azimkin af16af03f8
All checks were successful
Build and Push Docker Image / build (push) Successful in 27s
Make home button filters configurable
2026-06-16 09:56:11 +02:00

134 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import logging
from urllib.parse import urlencode
from django.conf import settings
from django.core.mail import send_mail
from django.db.models import BooleanField, Case, Value, When
from django.shortcuts import redirect, render
from django.urls import reverse
from django.contrib import messages
from favorites.services import get_user_favorite_item_ids
from home.forms import FaqQuestionForm
from items.models import Category, Item
from orders.services import get_user_cart_item_ids
logger = logging.getLogger(__name__)
CONTACT_ADDRESS = "Беларусь, г. Минск, ул. Тимирязева, д. 123, к.1, пав. 59"
CONTACT_EMAIL = "info@santehray.by"
CONTACT_PHONE_PRIMARY = "+375 (29) 688-18-19"
CONTACT_PHONE_PRIMARY_URL = "+375296881819"
CONTACT_PHONE_SECONDARY = "+375 (33) 337-67-81"
CONTACT_PHONE_SECONDARY_URL = "+375333376781"
CONTACT_HOURS_WEEKDAYS = "Пн-Пт: 9.00 - 21.00"
CONTACT_HOURS_WEEKENDS = "Сб-Вс: 10.00 - 18.00"
CONTACT_MAP_CENTER = {"lat": "53.9334960", "lon": "27.4551021", "zoom": 15}
CONTACT_MAP_EXTERNAL_URL = (
"https://www.openstreetmap.org/?mlat=53.9334960&mlon=27.4551021#map=15/53.9334960/27.4551021"
)
def build_home_category_url(category_slug: str, **query_params: str) -> str:
normalized_slug = (category_slug or "").strip().lower()
base_url = "/catalog/"
if normalized_slug and Category.objects.filter(slug=normalized_slug).exists():
base_url = f"/catalog/{normalized_slug}/"
clean_query_params = {key: value for key, value in query_params.items() if value}
if not clean_query_params:
return base_url
return f"{base_url}?{urlencode(clean_query_params)}"
def index(request):
form = FaqQuestionForm(request.POST or None)
if request.method == "POST" and form.is_valid():
subject = f"Новый вопрос с сайта {settings.SITE_NAME}"
message = "\n".join(
[
f"Имя: {form.cleaned_data['name']}",
f"Телефон: {form.cleaned_data['phone']}",
f"Вопрос: {form.cleaned_data['question']}",
"",
f"Страница: {request.build_absolute_uri('/')}",
]
)
try:
send_mail(
subject=subject,
message=message,
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=[settings.ADMINISTRATOR_EMAIL],
fail_silently=False,
)
except Exception:
logger.exception("Failed to send FAQ question email")
form.add_error(None, "Не удалось отправить вопрос. Попробуйте позже.")
else:
messages.success(request, "Спасибо. Ваш вопрос отправлен, мы свяжемся с вами в ближайшее время.")
return redirect(f"{reverse('home')}#faq-section")
home_products = (
Item.objects.filter(is_available=True)
.select_related("category", "subcategory")
.prefetch_related("images")
.annotate(
discount_sort=Case(
When(discount_price__isnull=False, then=Value(True)),
default=Value(False),
output_field=BooleanField(),
)
)
.order_by("-is_new", "-discount_sort", "-created_at")[:6]
)
return render(request=request, template_name='home/index.html', context={
"faq_form": form,
"home_products": home_products,
"home_advantages_left_url": build_home_category_url(
settings.HOME_ADVANTAGES_LEFT_CATEGORY_SLUG,
new="1" if settings.HOME_ADVANTAGES_LEFT_NEW_FILTER else "",
),
"home_advantages_right_url": build_home_category_url(
settings.HOME_ADVANTAGES_RIGHT_CATEGORY_SLUG,
sale="1" if settings.HOME_ADVANTAGES_RIGHT_SALE_FILTER else "",
),
"favorite_item_ids": get_user_favorite_item_ids(request.user),
"cart_item_ids": get_user_cart_item_ids(request.user),
})
def services(request):
return render(request=request, template_name='home/services.html', context={})
def shipping(request):
return render(request=request, template_name='home/shipping.html', context={})
def warranty(request):
return render(request=request, template_name='home/warranty.html', context={})
def contacts(request):
context = {
"contact_address": CONTACT_ADDRESS,
"contact_email": CONTACT_EMAIL,
"contact_phone_primary": CONTACT_PHONE_PRIMARY,
"contact_phone_primary_url": CONTACT_PHONE_PRIMARY_URL,
"contact_phone_secondary": CONTACT_PHONE_SECONDARY,
"contact_phone_secondary_url": CONTACT_PHONE_SECONDARY_URL,
"contact_hours_weekdays": CONTACT_HOURS_WEEKDAYS,
"contact_hours_weekends": CONTACT_HOURS_WEEKENDS,
"map_lat": CONTACT_MAP_CENTER["lat"],
"map_lon": CONTACT_MAP_CENTER["lon"],
"map_zoom": CONTACT_MAP_CENTER["zoom"],
"map_external_url": CONTACT_MAP_EXTERNAL_URL,
}
return render(request=request, template_name='home/contacts.html', context=context)