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)