All checks were successful
Build and Push Docker Image / build (push) Successful in 27s
134 lines
5.1 KiB
Python
134 lines
5.1 KiB
Python
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)
|