union_auto_test/core/mixins.py

2248 lines
97 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 requests
import datetime
import random
from django.conf import settings
from django.utils import timezone
from django.db.models import F, Q, ExpressionWrapper, fields, Func
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.http import Http404
from core.utils import (sql_request_for_api, japan_brands_available, japan_models_available,
korea_brands_available, korea_models_available, machinery_brands_available,
machinery_models_available, )
from core.models import (TransportBrand, TransportModel, MachineryBrand, MachineryModel,
ColorFilter, Rate, MainLot, KoreaLot, MachineryLot, MachineryFilter,
MachineryGroup, Review, TransportExperience, MachineryExperience, Video,
Article, Question, Category, Banner, Document, StockAuto)
from core.enums import (MaxListCars, MaxReviews, MaxTransportExperience, MaxMachineryExperience,
MaxVideos, MaxArticles, MaxQuestions, MaxBanners, MaxStockAuto)
class Replace(Func):
function = 'REPLACE'
template = "%(function)s(%(expressions)s, '-', ' ')"
class JapanLotsMixin:
page_param = 'page'
sort_param = 'sort'
brand_param = 'brand'
model_param = 'model'
color_param = 'color'
engine_volume_min_param = 'engine_volume_min'
engine_volume_max_param = 'engine_volume_max'
mileage_min_param = 'mileage_min'
mileage_max_param = 'mileage_max'
year_min_param = 'year_min'
year_max_param = 'year_max'
price_min_param = 'price_min'
price_max_param = 'price_max'
lot_param = 'lot'
default_page_param = 1
default_sort_param = 'avg_price'
def get_context_data(self, **kwargs):
AUCTION_ENDPOINT = settings.AUCTION_ENDPOINT
if self.request.ip_address:
AUCTION_ENDPOINT = AUCTION_ENDPOINT.replace('?json', f'?json&ip={self.request.ip_address}')
context = super().get_context_data(**kwargs)
context['curr_title'] = 'Подобрать авто из Японии с доставкой по России - более 42 000 авто на сайте'
context[
'curr_description'] = 'Выберите и закажите авто с аукциона в Японии на нашем сайте. Union Auto возьмет на себя все заботы по приобретению и оптимальной доставке в любой город России. Оставляйте заявку!'
# context['canonical'] = reverse('core:catalog_japan')
context['page'] = self.request.GET.get(self.page_param, self.default_page_param)
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
context['color_query'] = self.request.GET.get(self.color_param)
context['engine_volume_min_query'] = self.request.GET.get(self.engine_volume_min_param)
context['engine_volume_max_query'] = self.request.GET.get(self.engine_volume_max_param)
context['mileage_min_query'] = self.request.GET.get(self.mileage_min_param)
context['mileage_max_query'] = self.request.GET.get(self.mileage_max_param)
context['year_min_query'] = self.request.GET.get(self.year_min_param)
context['year_max_query'] = self.request.GET.get(self.year_max_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['lot_query'] = self.request.GET.get(self.lot_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='1', brand=url_brand)
context['model_query'] = str(url_model.id)
sql_request = f"select * from main where (status LIKE '%25not sold%25' or status='') and (auction not like '%25uss%25') and YEAR>={settings.MIN_YEAR}"
if model_id := context['model_query']:
model = get_object_or_404(TransportModel, id=model_id, category="1")
sql_request += f' and MODEL_ID="{str(model.db_id)}"'
sql_request += f' and MARKA_ID="{str(model.brand.db_id)}"'
curr_title = f'Выбери свой {model.brand.title} {model.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с аукционов Японии'
curr_description = f'Ищете {model.brand.title} {model.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор автомобилей и спецтехники с аукционов Японии с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
else:
if brand_id := context['brand_query']:
brand = get_object_or_404(TransportBrand, id=brand_id)
sql_request += f' and MARKA_ID="{str(brand.db_id)}"'
curr_title = f'Выбери свой {brand.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с аукционов Японии'
curr_description = f'Ищете {brand.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор автомобилей и спецтехники с аукционов Японии с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
if color_id := self.request.GET.get(self.color_param):
color = get_object_or_404(ColorFilter, id=color_id)
sql_request += f" and COLOR LIKE '%25{color.contain}%25'"
if engine_min_volume := self.request.GET.get(self.engine_volume_min_param):
try:
engine_min_volume = int(engine_min_volume)
sql_request += f' and ENG_V>={engine_min_volume}'
except:
pass
if engine_max_volume := self.request.GET.get(self.engine_volume_max_param):
try:
engine_max_volume = int(engine_max_volume)
sql_request += f' and ENG_V<={engine_max_volume}'
except:
pass
if mileage_min := self.request.GET.get(self.mileage_min_param):
try:
mileage_min = int(mileage_min)
sql_request += f' and MILEAGE>={mileage_min}'
except:
pass
if mileage_max := self.request.GET.get(self.mileage_max_param):
try:
mileage_max = int(mileage_max)
sql_request += f' and MILEAGE<={mileage_max}'
except:
pass
if year_min := self.request.GET.get(self.year_min_param):
try:
year_min = int(year_min)
sql_request += f' and YEAR>={year_min}'
except:
pass
if year_max := self.request.GET.get(self.year_max_param):
try:
year_max = int(year_max)
sql_request += f' and YEAR<={year_max}'
except:
pass
if price_min := self.request.GET.get(self.price_min_param):
rate = Rate.objects.get(slug='rub-jpy')
try:
price_min = int(int(price_min) * rate.rate)
sql_request += f' and AVG_PRICE>={price_min}'
except:
pass
if price_max := self.request.GET.get(self.price_max_param):
rate = Rate.objects.get(slug='rub-jpy')
try:
price_max = int(int(price_max) * rate.rate)
sql_request += f' and AVG_PRICE<={price_max}'
except:
pass
if lot := self.request.GET.get(self.lot_param):
sql_request += f' and LOT={lot}'
sql_request_quantity = sql_request.replace('*', 'count(*)', 1)
sql_request_quantity = sql_request_for_api(sql_request_quantity)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request_quantity)
lots_quantity = int(response.json()[0].get('TAG0'))
except:
lots_quantity = 0
context['total_lots'] = lots_quantity
sort_param = self.request.GET.get(self.sort_param, self.default_sort_param)
order_param = ''
if '-' in sort_param:
order_param = ' desc'
sort_param = sort_param.replace('-', '')
sql_request += f' order by {sort_param}{order_param}'
page_num = int(self.request.GET.get(self.page_param, self.default_page_param))
sql_request += f' limit {(page_num - 1) * MaxListCars.CATALOG_PAGE},{MaxListCars.CATALOG_PAGE}'
sql_request = sql_request_for_api(sql_request)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request)
lots = response.json()
except:
lots = None
cars = []
if lots:
for lot_info in lots:
lot_id = lot_info.get('ID')
main_lot, created = MainLot.objects.get_or_create(db_id=lot_id)
if created:
brand_id = int(lot_info.get('MARKA_ID'))
brand_title = lot_info.get('MARKA_NAME').upper()
model_id = int(lot_info.get('MODEL_ID'))
model_title = lot_info.get('MODEL_NAME').upper()
brand, _ = TransportBrand.objects.get_or_create(db_id=brand_id, title=brand_title)
model, _ = TransportModel.objects.get_or_create(brand=brand, db_id=model_id, title=model_title,
category='1')
try:
year = int(lot_info.get('YEAR'))
except:
year = None
try:
eng_v = int(lot_info.get('ENG_V'))
except:
eng_v = None
try:
pw = int(lot_info.get('PW'))
except:
try:
pw = int(lot_info.get('PW').split(',')[0])
except:
pw = None
try:
mileage = int(lot_info.get('MILEAGE'))
except:
mileage = None
try:
start = int(lot_info.get('START'))
except:
start = None
try:
finish = int(lot_info.get('FINISH'))
except:
finish = None
try:
avg_price = int(lot_info.get('AVG_PRICE'))
except:
avg_price = None
images = lot_info.get('IMAGES').split('#')
if len(images) > 0:
cover = images[0]
else:
cover = None
if len(images) > 1:
images = '#'.join(images[1::])
else:
images = None
main_lot.lot = lot_info.get('LOT')
main_lot.auction_date = lot_info.get('AUCTION_DATE')
main_lot.auction = lot_info.get('AUCTION')
main_lot.car_model = model
main_lot.year = year
main_lot.eng_v = eng_v
main_lot.pw = pw
main_lot.town = lot_info.get('TOWN')
main_lot.kuzov = lot_info.get('KUZOV')
main_lot.grade = lot_info.get('GRADE')
main_lot.color = lot_info.get('COLOR')
main_lot.kpp = lot_info.get('KPP')
main_lot.kpp_type = lot_info.get('KPP_TYPE')
main_lot.priv = lot_info.get('PRIV')
main_lot.mileage = mileage
main_lot.equip = lot_info.get('EQUIP')
main_lot.rate = lot_info.get('RATE')
main_lot.start = start
main_lot.finish = finish
main_lot.status = lot_info.get('STATUS')
main_lot.time = lot_info.get('TIME')
main_lot.avg_price = avg_price
main_lot.avg_string = lot_info.get('AVG_STRING')
main_lot.cover = cover
main_lot.images = images
main_lot.save()
cars.append(main_lot)
context['lots'] = cars
if context['brand_query']:
models_available = []
if url_brand:
models_available = japan_models_available(url_brand.db_id, self.request.ip_address)
if models_available:
context['models'] = TransportModel.objects.filter(Q(brand__id=context['brand_query']) &
Q(category="1") &
Q(db_id__in=models_available)).distinct()
else:
context['models'] = TransportModel.objects.filter(
Q(brand__id=context['brand_query']) & Q(category="1")).distinct()
return context
class KoreanLotsMixin:
page_param = 'page'
sort_param = 'sort'
brand_param = 'brand'
model_param = 'model'
color_param = 'color'
engine_volume_min_param = 'engine_volume_min'
engine_volume_max_param = 'engine_volume_max'
mileage_min_param = 'mileage_min'
mileage_max_param = 'mileage_max'
year_min_param = 'year_min'
year_max_param = 'year_max'
price_min_param = 'price_min'
price_max_param = 'price_max'
lot_param = 'lot'
default_page_param = 1
default_sort_param = 'avg_price'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
AUCTION_ENDPOINT = settings.AUCTION_ENDPOINT
if self.request.ip_address:
AUCTION_ENDPOINT = AUCTION_ENDPOINT.replace('?json', f'?json&ip={self.request.ip_address}')
context['curr_title'] = 'Подобрать авто из Кореи с доставкой по России - более 123 000 авто на сайте'
context[
'curr_description'] = 'Выберите и закажите авто из Кореи на нашем сайте. Union Auto возьмет на себя все заботы по приобретению и оптимальной доставке в любой город России. Оставляйте заявку!'
# context['canonical'] = reverse('core:catalog_korea')
context['page'] = self.request.GET.get(self.page_param, self.default_page_param)
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
context['color_query'] = self.request.GET.get(self.color_param)
context['engine_volume_min_query'] = self.request.GET.get(self.engine_volume_min_param)
context['engine_volume_max_query'] = self.request.GET.get(self.engine_volume_max_param)
context['mileage_min_query'] = self.request.GET.get(self.mileage_min_param)
context['mileage_max_query'] = self.request.GET.get(self.mileage_max_param)
context['year_min_query'] = self.request.GET.get(self.year_min_param)
context['year_max_query'] = self.request.GET.get(self.year_max_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['lot_query'] = self.request.GET.get(self.lot_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='2', brand=url_brand)
context['model_query'] = str(url_model.id)
sql_request = f"select * from korea where (status LIKE '%25not sold%25' or status='') and YEAR>={settings.MIN_YEAR}"
if model_id := context['model_query']:
model = get_object_or_404(TransportModel, id=model_id, category="2")
sql_request += f' and MODEL_ID={model.db_id}'
sql_request += f' and MARKA_ID={model.brand.db_id}'
curr_title = f'Выбери свой {model.brand.title} {model.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с торговых площадок Кореи'
curr_description = f'Ищете {model.brand.title} {model.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор автомобилей с торговых площадок Кореи с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
else:
if brand_id := context['brand_query']:
brand = get_object_or_404(TransportBrand, id=brand_id)
sql_request += f' and MARKA_ID={brand.db_id}'
curr_title = f'Выбери свой {brand.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с торговых площадок Кореи'
curr_description = f'Ищете {brand.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор автомобилей с торговых площадок Кореи с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
if color_id := self.request.GET.get(self.color_param):
color = get_object_or_404(ColorFilter, id=color_id)
sql_request += f" and COLOR LIKE '%25{color.contain}%25'"
if engine_min_volume := self.request.GET.get(self.engine_volume_min_param):
try:
engine_min_volume = int(engine_min_volume)
sql_request += f' and ENG_V>={engine_min_volume}'
except:
pass
if engine_max_volume := self.request.GET.get(self.engine_volume_max_param):
try:
engine_max_volume = int(engine_max_volume)
sql_request += f' and ENG_V<={engine_max_volume}'
except:
pass
if mileage_min := self.request.GET.get(self.mileage_min_param):
try:
mileage_min = int(mileage_min)
sql_request += f' and MILEAGE>={mileage_min}'
except:
pass
if mileage_max := self.request.GET.get(self.mileage_max_param):
try:
mileage_max = int(mileage_max)
sql_request += f' and MILEAGE<={mileage_max}'
except:
pass
if year_min := self.request.GET.get(self.year_min_param):
try:
year_min = int(year_min)
sql_request += f' and YEAR>={year_min}'
except:
pass
if year_max := self.request.GET.get(self.year_max_param):
try:
year_max = int(year_max)
sql_request += f' and YEAR<={year_max}'
except:
pass
if price_min := self.request.GET.get(self.price_min_param):
rate = Rate.objects.get(slug='rub-krw')
try:
price_min = int(int(price_min) * rate.rate)
sql_request += f' and AVG_PRICE>={price_min}'
except:
pass
if price_max := self.request.GET.get(self.price_max_param):
rate = Rate.objects.get(slug='rub-krw')
try:
price_max = int(int(price_max) * rate.rate)
sql_request += f' and AVG_PRICE<={price_max}'
except:
pass
if lot := self.request.GET.get(self.lot_param):
sql_request += f' and LOT={lot}'
sql_request_quantity = sql_request.replace('*', 'count(*)', 1)
sql_request_quantity = sql_request_for_api(sql_request_quantity)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request_quantity)
lots_quantity = int(response.json()[0].get('TAG0'))
except:
lots_quantity = 0
context['total_lots'] = lots_quantity
sort_param = self.request.GET.get(self.sort_param, self.default_sort_param)
order_param = ''
if '-' in sort_param:
order_param = ' desc'
sort_param = sort_param.replace('-', '')
sql_request += f' order by {sort_param}{order_param}'
page_num = int(self.request.GET.get(self.page_param, self.default_page_param))
sql_request += f' limit {(page_num - 1) * MaxListCars.CATALOG_PAGE},{MaxListCars.CATALOG_PAGE}'
sql_request = sql_request_for_api(sql_request)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request)
lots = response.json()
except:
lots = None
if lots:
cars = []
for lot_info in lots:
lot_id = lot_info.get('ID')
main_lot, created = KoreaLot.objects.get_or_create(db_id=lot_id)
if created:
brand_id = int(lot_info.get('MARKA_ID'))
brand_title = lot_info.get('MARKA_NAME').upper()
model_id = int(lot_info.get('MODEL_ID'))
model_title = lot_info.get('MODEL_NAME').upper()
brand, _ = TransportBrand.objects.get_or_create(db_id=brand_id, title=brand_title)
model, _ = TransportModel.objects.get_or_create(brand=brand, db_id=model_id, title=model_title,
category='2')
try:
year = int(lot_info.get('YEAR'))
except:
year = None
try:
eng_v = int(lot_info.get('ENG_V'))
except:
eng_v = None
try:
pw = int(lot_info.get('PW'))
except:
try:
pw = int(lot_info.get('PW').split(',')[0])
except:
pw = None
try:
mileage = int(lot_info.get('MILEAGE'))
except:
mileage = None
try:
start = int(lot_info.get('START'))
except:
start = None
try:
finish = int(lot_info.get('FINISH'))
except:
finish = None
try:
avg_price = int(lot_info.get('AVG_PRICE'))
except:
avg_price = None
images = lot_info.get('IMAGES').split('#')
if len(images) > 0:
cover = images[0]
else:
cover = None
if len(images) > 1:
images = '#'.join(images[1::])
else:
images = None
main_lot.lot = lot_info.get('LOT')
main_lot.auction_date = lot_info.get('AUCTION_DATE')
main_lot.auction = lot_info.get('AUCTION')
main_lot.car_model = model
main_lot.year = year
main_lot.eng_v = eng_v
main_lot.pw = pw
main_lot.kuzov = lot_info.get('KUZOV')
main_lot.grade = lot_info.get('GRADE')
main_lot.color = lot_info.get('COLOR')
main_lot.kpp = lot_info.get('KPP')
main_lot.kpp_type = lot_info.get('KPP_TYPE')
main_lot.priv = lot_info.get('PRIV')
main_lot.mileage = mileage
main_lot.equip = lot_info.get('EQUIP')
main_lot.rate = lot_info.get('RATE')
main_lot.start = start
main_lot.finish = finish
main_lot.status = lot_info.get('STATUS')
main_lot.time = lot_info.get('TIME')
main_lot.avg_price = avg_price
main_lot.avg_string = lot_info.get('AVG_STRING')
main_lot.cover = cover
main_lot.images = images
main_lot.save()
cars.append(main_lot)
context['lots'] = cars
if context['brand_query']:
models_available = []
if url_brand:
models_available = korea_models_available(url_brand.db_id, self.request.ip_address)
if models_available:
context['models'] = TransportModel.objects.filter(Q(brand__id=context['brand_query']) &
Q(category="2") &
Q(db_id__in=models_available)).distinct()
else:
context['models'] = TransportModel.objects.filter(
Q(brand__id=context['brand_query']) & Q(category="2")).distinct()
return context
class MachineryLotsMixin:
page_param = 'page'
sort_param = 'sort'
type_param = 'type'
brand_param = 'brand'
model_param = 'model'
price_min_param = 'price_min'
price_max_param = 'price_max'
lot_param = 'lot'
default_page_param = 1
default_sort_param = 'price'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
MACHINERY_ENDPOINT = settings.MACHINERY_ENDPOINT
if self.request.ip_address:
MACHINERY_ENDPOINT = MACHINERY_ENDPOINT.replace('?json', f'?json&ip={self.request.ip_address}')
context['curr_title'] = 'Подобрать спецтехнику из Японии с доставкой по России - более 28 000 единиц на сайте'
context[
'curr_description'] = 'Выберите и закажите спецтехнику с аукциона в Японии на нашем сайте. Union Auto возьмет на себя все заботы по приобретению и оптимальной доставке в любой город России. Оставляйте заявку!'
# context['canonical'] = reverse('core:catalog_machinery')
context['page'] = self.request.GET.get(self.page_param, self.default_page_param)
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['type_query'] = self.request.GET.get(self.type_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['lot_query'] = self.request.GET.get(self.lot_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = MachineryBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
).filter(clean_title=url_brand).first()
if not url_brand:
raise Http404("Объект не найден")
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(MachineryModel.objects.annotate(
clean_title=Replace('title')
), clean_title=url_model, brand=url_brand)
context['model_query'] = str(url_model.id)
sql_request = f"select * from hdm where (status LIKE '%25not sold%25' or status='')"
if type_id := self.request.GET.get(self.type_param):
machinery_filter = get_object_or_404(MachineryFilter, id=type_id)
for num, machinery_group in enumerate(machinery_filter.groups.all()):
group_title = machinery_group.title.replace('&', '%26')
if num == 0:
sql_request += f" and (category LIKE '%25{group_title}%25'"
else:
sql_request += f" or category LIKE '%25{group_title}%25'"
sql_request += ')'
if model_id := context['model_query']:
model = get_object_or_404(MachineryModel, id=model_id)
sql_request += f' and MODEL_NAME LIKE "%25{model.title}%25"'
sql_request += f' and MARKA_ID={model.brand.db_id}'
curr_title = f'Выбери свой {model.brand.title} {model.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с аукционов Японии'
curr_description = f'Ищете {model.brand.title} {model.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор автомобилей и спецтехники с аукционов Японии с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
else:
if brand_id := context['brand_query']:
brand = get_object_or_404(MachineryBrand, id=brand_id)
sql_request += f' and MARKA_ID={brand.db_id}'
curr_title = f'Выбери свой {brand.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с аукционов Японии'
curr_description = f'Ищете {brand.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор автомобилей и спецтехники с аукционов Японии с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
if price_min := self.request.GET.get(self.price_min_param):
rate = Rate.objects.get(slug='rub-jpy')
try:
price_min = int(int(price_min) * rate.rate)
sql_request += f' and PRICE>={price_min}'
except:
pass
if price_max := self.request.GET.get(self.price_max_param):
rate = Rate.objects.get(slug='rub-jpy')
try:
price_max = int(int(price_max) * rate.rate)
sql_request += f' and PRICE<={price_max}'
except:
pass
if lot := self.request.GET.get(self.lot_param):
sql_request += f' and LOT={lot}'
sql_request_quantity = sql_request.replace('*', 'count(*)', 1)
sql_request_quantity = sql_request_for_api(sql_request_quantity)
try:
response = requests.get(MACHINERY_ENDPOINT + sql_request_quantity)
lots_quantity = int(response.json()[0].get('TAG0'))
except:
lots_quantity = 0
context['total_lots'] = lots_quantity
sort_param = self.request.GET.get(self.sort_param, self.default_sort_param)
order_param = ''
if '-' in sort_param:
order_param = ' desc'
sort_param = sort_param.replace('-', '')
sql_request += f' order by {sort_param}{order_param}'
page_num = int(self.request.GET.get(self.page_param, self.default_page_param))
sql_request += f' limit {(page_num - 1) * MaxListCars.CATALOG_PAGE},{MaxListCars.CATALOG_PAGE}'
sql_request = sql_request_for_api(sql_request)
try:
response = requests.get(MACHINERY_ENDPOINT + sql_request)
lots = response.json()
except:
lots = None
if lots:
cars = []
for lot_info in lots:
lot_id = lot_info.get('ID')
main_lot, created = MachineryLot.objects.get_or_create(db_id=lot_id)
if created:
brand_id = int(lot_info.get('MARKA_ID'))
brand_title = lot_info.get('MARKA_NAME').upper()
model_title = lot_info.get('MODEL_NAME').upper()
brand, _ = MachineryBrand.objects.get_or_create(db_id=brand_id, title=brand_title)
model, _ = MachineryModel.objects.get_or_create(brand=brand, title=model_title)
try:
year = int(lot_info.get('YEAR'))
except:
year = None
try:
mileage = int(lot_info.get('MILEAGE'))
except:
mileage = None
try:
price = int(lot_info.get('PRICE'))
except:
price = None
try:
finish = int(lot_info.get('FINISH'))
except:
finish = None
images = lot_info.get('IMAGES').split('#')
if len(images) > 0:
cover = images[0]
else:
cover = None
if len(images) > 1:
images = '#'.join(images[1::])
else:
images = None
machinery_group = lot_info.get('CATEGORY')
machinery_type = None
if machinery_group:
curr_group = MachineryGroup.objects.filter(title=machinery_group.upper()).first()
if curr_group:
machinery_type = curr_group.filters.first()
main_lot.lot = lot_info.get('LOT')
main_lot.auction_date = lot_info.get('AUCTION_DATE')
main_lot.auction = lot_info.get('AUCTION')
main_lot.group = lot_info.get('GROUP')
main_lot.category = machinery_group
main_lot.gg = lot_info.get('GG')
main_lot.cc = lot_info.get('CC')
main_lot.machinery_model = model
main_lot.year = year
main_lot.grade = lot_info.get('GRADE')
main_lot.kpp = lot_info.get('KPP')
main_lot.priv = lot_info.get('PRIV')
main_lot.mileage = mileage
main_lot.rate = lot_info.get('RATE')
main_lot.price = price
main_lot.finish = finish
main_lot.status = lot_info.get('STATUS')
main_lot.cover = cover
main_lot.images = images
main_lot.machinery_filter = machinery_type
main_lot.save()
cars.append(main_lot)
context['lots'] = cars
if context['brand_query']:
models_available = []
if url_brand:
models_available = machinery_models_available(url_brand.db_id, self.request.ip_address)
if models_available:
context['models'] = MachineryModel.objects.filter(Q(brand__id=context['brand_query']) &
Q(title__in=models_available)).distinct()
else:
context['models'] = MachineryModel.objects.filter(brand__id=context['brand_query']).distinct()
return context
class TruckLotsMixin:
page_param = 'page'
sort_param = 'sort'
brand_param = 'brand'
model_param = 'model'
color_param = 'color'
engine_volume_min_param = 'engine_volume_min'
engine_volume_max_param = 'engine_volume_max'
mileage_min_param = 'mileage_min'
mileage_max_param = 'mileage_max'
year_min_param = 'year_min'
year_max_param = 'year_max'
price_min_param = 'price_min'
price_max_param = 'price_max'
lot_param = 'lot'
default_page_param = 1
default_sort_param = 'avg_price'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
AUCTION_ENDPOINT = settings.AUCTION_ENDPOINT
if self.request.ip_address:
AUCTION_ENDPOINT = AUCTION_ENDPOINT.replace('?json', f'?json&ip={self.request.ip_address}')
context['curr_title'] = 'Подобрать грузовой автомобиль из Японии с доставкой по России'
context[
'curr_description'] = 'Выберите и закажите грузовой автомобиль с аукциона в Японии на нашем сайте. Union Auto возьмет на себя все заботы по приобретению и оптимальной доставке в любой город России. Оставляйте заявку!'
# context['canonical'] = reverse('core:catalog_japan')
context['page'] = self.request.GET.get(self.page_param, self.default_page_param)
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
context['color_query'] = self.request.GET.get(self.color_param)
context['engine_volume_min_query'] = self.request.GET.get(self.engine_volume_min_param)
context['engine_volume_max_query'] = self.request.GET.get(self.engine_volume_max_param)
context['mileage_min_query'] = self.request.GET.get(self.mileage_min_param)
context['mileage_max_query'] = self.request.GET.get(self.mileage_max_param)
context['year_min_query'] = self.request.GET.get(self.year_min_param)
context['year_max_query'] = self.request.GET.get(self.year_max_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['lot_query'] = self.request.GET.get(self.lot_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='1', brand=url_brand)
context['model_query'] = str(url_model.id)
sql_request = f"select * from main where (status LIKE '%25not sold%25' or status='') and (auction not like '%25uss%25')"
if settings.TRUCKS:
sql_request += ' and ('
for num, truck in enumerate(settings.TRUCKS):
if num == 0:
sql_request += f'(MODEL_ID="{str(truck[1])}" and MARKA_ID="{str(truck[0])}")'
else:
sql_request += f' or (MODEL_ID="{str(truck[1])}" and MARKA_ID="{str(truck[0])}")'
sql_request += ')'
if model_id := context['model_query']:
model = get_object_or_404(TransportModel, id=model_id, category="1")
sql_request += f' and MODEL_ID="{str(model.db_id)}"'
sql_request += f' and MARKA_ID="{str(model.brand.db_id)}"'
curr_title = f'Выбери свой {model.brand.title} {model.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с аукционов Японии'
curr_description = f'Ищете {model.brand.title} {model.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор грузовых автомобилей с аукционов Японии с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
else:
if brand_id := context['brand_query']:
brand = get_object_or_404(TransportBrand, id=brand_id)
sql_request += f' and MARKA_ID="{str(brand.db_id)}"'
curr_title = f'Выбери свой {brand.title}'
if price_min := self.request.GET.get(self.price_min_param):
curr_title += f' по цене от {price_min}'
curr_title += ' с аукционов Японии'
curr_description = f'Ищете {brand.title} в хорошем состоянии и адекватной цене? На нашем сайте вы найдете большой выбор грузовых автомобилей с аукционов Японии с доставкой по городам РФ.'
context['curr_title'] = curr_title
context['curr_description'] = curr_description
else:
sql_request += f' and not MARKA_ID="1"'
if color_id := self.request.GET.get(self.color_param):
color = get_object_or_404(ColorFilter, id=color_id)
sql_request += f" and COLOR LIKE '%25{color.contain}%25'"
if engine_min_volume := self.request.GET.get(self.engine_volume_min_param):
try:
engine_min_volume = int(engine_min_volume)
sql_request += f' and ENG_V>={engine_min_volume}'
except:
pass
if engine_max_volume := self.request.GET.get(self.engine_volume_max_param):
try:
engine_max_volume = int(engine_max_volume)
sql_request += f' and ENG_V<={engine_max_volume}'
except:
pass
if mileage_min := self.request.GET.get(self.mileage_min_param):
try:
mileage_min = int(mileage_min)
sql_request += f' and MILEAGE>={mileage_min}'
except:
pass
if mileage_max := self.request.GET.get(self.mileage_max_param):
try:
mileage_max = int(mileage_max)
sql_request += f' and MILEAGE<={mileage_max}'
except:
pass
if year_min := self.request.GET.get(self.year_min_param):
try:
year_min = int(year_min)
sql_request += f' and YEAR>={year_min}'
except:
pass
if year_max := self.request.GET.get(self.year_max_param):
try:
year_max = int(year_max)
sql_request += f' and YEAR<={year_max}'
except:
pass
if price_min := self.request.GET.get(self.price_min_param):
rate = Rate.objects.get(slug='rub-jpy')
try:
price_min = int(int(price_min) * rate.rate)
sql_request += f' and AVG_PRICE>={price_min}'
except:
pass
if price_max := self.request.GET.get(self.price_max_param):
rate = Rate.objects.get(slug='rub-jpy')
try:
price_max = int(int(price_max) * rate.rate)
sql_request += f' and AVG_PRICE<={price_max}'
except:
pass
if lot := self.request.GET.get(self.lot_param):
sql_request += f' and LOT={lot}'
sql_request_quantity = sql_request.replace('*', 'count(*)', 1)
sql_request_quantity = sql_request_for_api(sql_request_quantity)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request_quantity)
lots_quantity = int(response.json()[0].get('TAG0'))
except:
lots_quantity = 0
context['total_lots'] = lots_quantity
sort_param = self.request.GET.get(self.sort_param, self.default_sort_param)
order_param = ''
if '-' in sort_param:
order_param = ' desc'
sort_param = sort_param.replace('-', '')
sql_request += f' order by {sort_param}{order_param}'
page_num = int(self.request.GET.get(self.page_param, self.default_page_param))
sql_request += f' limit {(page_num - 1) * MaxListCars.CATALOG_PAGE},{MaxListCars.CATALOG_PAGE}'
sql_request = sql_request_for_api(sql_request)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request)
lots = response.json()
except:
lots = None
cars = []
if lots:
for lot_info in lots:
lot_id = lot_info.get('ID')
main_lot, created = MainLot.objects.get_or_create(db_id=lot_id)
if created:
brand_id = int(lot_info.get('MARKA_ID'))
brand_title = lot_info.get('MARKA_NAME').upper()
model_id = int(lot_info.get('MODEL_ID'))
model_title = lot_info.get('MODEL_NAME').upper()
brand, _ = TransportBrand.objects.get_or_create(db_id=brand_id, title=brand_title)
model, _ = TransportModel.objects.get_or_create(brand=brand, db_id=model_id, title=model_title,
category='1')
try:
year = int(lot_info.get('YEAR'))
except:
year = None
try:
eng_v = int(lot_info.get('ENG_V'))
except:
eng_v = None
try:
pw = int(lot_info.get('PW'))
except:
try:
pw = int(lot_info.get('PW').split(',')[0])
except:
pw = None
try:
mileage = int(lot_info.get('MILEAGE'))
except:
mileage = None
try:
start = int(lot_info.get('START'))
except:
start = None
try:
finish = int(lot_info.get('FINISH'))
except:
finish = None
try:
avg_price = int(lot_info.get('AVG_PRICE'))
except:
avg_price = None
images = lot_info.get('IMAGES').split('#')
if len(images) > 0:
cover = images[0]
else:
cover = None
if len(images) > 1:
images = '#'.join(images[1::])
else:
images = None
main_lot.lot = lot_info.get('LOT')
main_lot.auction_date = lot_info.get('AUCTION_DATE')
main_lot.auction = lot_info.get('AUCTION')
main_lot.car_model = model
main_lot.year = year
main_lot.eng_v = eng_v
main_lot.pw = pw
main_lot.town = lot_info.get('TOWN')
main_lot.kuzov = lot_info.get('KUZOV')
main_lot.grade = lot_info.get('GRADE')
main_lot.color = lot_info.get('COLOR')
main_lot.kpp = lot_info.get('KPP')
main_lot.kpp_type = lot_info.get('KPP_TYPE')
main_lot.priv = lot_info.get('PRIV')
main_lot.mileage = mileage
main_lot.equip = lot_info.get('EQUIP')
main_lot.rate = lot_info.get('RATE')
main_lot.start = start
main_lot.finish = finish
main_lot.status = lot_info.get('STATUS')
main_lot.time = lot_info.get('TIME')
main_lot.avg_price = avg_price
main_lot.avg_string = lot_info.get('AVG_STRING')
main_lot.cover = cover
main_lot.images = images
main_lot.save()
cars.append(main_lot)
context['lots'] = cars
if context['brand_query']:
models_available = []
if url_brand:
models_available = japan_models_available(url_brand.db_id, self.request.ip_address)
if models_available:
context['models'] = TransportModel.objects.filter(Q(brand__id=context['brand_query']) &
Q(category="1") &
Q(db_id__in=models_available) &
Q(db_id__in=settings.TRUCK_MODELS)).distinct()
else:
context['models'] = TransportModel.objects.filter(Q(brand__id=context['brand_query']) &
Q(category="1") &
Q(db_id__in=settings.TRUCK_MODELS)).distinct()
return context
class TitleMixin:
title = None
def get_context_data(self, **kwargs):
context = super(TitleMixin, self).get_context_data()
context['title'] = self.title
return context
class MainPageJapanLotsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['japan_lots'] = MainLot.objects.filter(
Q(full_info=True) & Q(cover__isnull=False) & ~Q(car_model__db_id__in=settings.TRUCK_MODELS)).order_by(
'?').distinct()[:MaxListCars.MAIN_PAGE]
return context
class MainPageKoreanLotsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['korean_lots'] = KoreaLot.objects.filter(Q(full_info=True) & Q(cover__isnull=False)).order_by(
'?').distinct()[:MaxListCars.MAIN_PAGE]
return context
class MainPageTruckLotsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['truck_lots'] = MainLot.objects.filter(
Q(full_info=True) &
Q(cover__isnull=False) &
Q(car_model__db_id__in=settings.TRUCK_MODELS) &
~Q(car_model__brand__db_id='1')).order_by('?').distinct()[:MaxListCars.MAIN_PAGE]
return context
class MainPageMachineryLotsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['machinery_lots'] = MachineryLot.objects.filter(Q(full_info=True) & Q(cover__isnull=False)).order_by(
'?').distinct()[:MaxListCars.MAIN_PAGE]
return context
class MainPageReviewsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['reviews'] = Review.objects.filter(Q(is_active=True) & Q(on_main=True)).distinct().select_related(
'screen')[:MaxReviews.MAIN_PAGE]
return context
class MainPageExperienceMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
experience = []
experience += list(
TransportExperience.objects.filter(Q(is_active=True) & Q(on_main=True)).distinct().select_related('cover')[
:MaxTransportExperience.MAIN_PAGE])
experience += list(
MachineryExperience.objects.filter(Q(is_active=True) & Q(on_main=True)).distinct().select_related('cover')[
:MaxMachineryExperience.MAIN_PAGE])
context['experience'] = set(experience)
return context
class MainPageStockAutoMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['stock_auto'] = StockAuto.objects.filter(Q(is_active=True) & Q(on_main=True)).distinct().select_related(
'cover')[:MaxStockAuto.MAIN_PAGE]
return context
class MainPageVideosMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['videos'] = Video.objects.filter(Q(is_active=True) & Q(on_main=True)).distinct()[:MaxVideos.MAIN_PAGE]
return context
class MainPageQuestionsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['questions'] = Question.objects.filter(is_active=True).distinct()[:MaxQuestions.MAIN_PAGE]
return context
class MainPageArticlesMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['articles'] = Article.objects.filter(
Q(is_active=True) & Q(date__lte=timezone.now())).distinct().select_related('cover')[:MaxArticles.MAIN_PAGE]
return context
class AllLotsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
lots = []
lots += list(MainLot.objects.filter(Q(full_info=True) & Q(cover__isnull=False)).order_by('?').distinct()[
:MaxListCars.SERVICES_PAGE])
lots += list(KoreaLot.objects.filter(Q(full_info=True) & Q(cover__isnull=False)).order_by('?').distinct()[
:MaxListCars.SERVICES_PAGE])
lots += list(MachineryLot.objects.filter(Q(full_info=True) & Q(cover__isnull=False)).order_by('?').distinct()[
:MaxListCars.MACHINERY_SERVICES_PAGE])
context['lots'] = set(lots)
return context
class ArticlesSidebarMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['sidebar_articles'] = Article.objects.filter(Q(is_active=True) & Q(date__lte=timezone.now())).order_by(
'?').distinct().select_related('cover')[:MaxArticles.SIDEBAR]
return context
class ReviewsQuerySetMixin:
filter_param = 'filter'
sort_param = 'sort'
default_sort_param = '-date'
def get_queryset(self):
queryset = super().get_queryset().filter(is_active=True).select_related('screen')
filter_query = self.request.GET.get(self.filter_param)
if filter_query:
queryset = queryset.filter(source=filter_query).distinct()
sort_by = self.request.GET.get(self.sort_param, self.default_sort_param)
queryset = queryset.order_by(sort_by)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['filter_query'] = self.request.GET.get(self.filter_param)
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
return context
class ArticlesQuerySetMixin:
filter_param = 'filter'
def get_queryset(self):
queryset = super().get_queryset().filter(Q(is_active=True) & Q(date__lte=timezone.now())).select_related(
'cover')
filter_query = self.request.GET.get(self.filter_param)
if filter_query:
queryset = queryset.filter(category__id=int(filter_query)).distinct()
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['filter_query'] = self.request.GET.get(self.filter_param)
context['categories'] = Category.objects.all()
return context
class BannersSidebarMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['banners'] = Banner.objects.filter(is_active=True).order_by('?')[:MaxBanners.SIDEBAR]
return context
class ExperienceAllQuerySetMixin:
def get_queryset(self):
auto_experience = list(TransportExperience.objects.filter(is_active=True).all())
machinery_experience = list(MachineryExperience.objects.filter(is_active=True).all())
lots = auto_experience + machinery_experience
lots.sort(key=lambda obj: obj.id)
return lots
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# context['canonical'] = reverse('core:experience_all')
context['total_objects'] = len(self.get_queryset())
return context
class ExperienceJapanQuerySetMixin:
brand_param = 'brand'
model_param = 'model'
year_min_param = 'year_min'
year_max_param = 'year_max'
price_min_param = 'price_min'
price_max_param = 'price_max'
sort_param = 'sort'
default_sort_param = 'auction_price_rub'
def get_queryset(self):
queryset = super().get_queryset().filter(is_active=True).select_related('cover')
queryset = queryset.filter(category='1').distinct()
brand = self.request.GET.get(self.brand_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
brand = str(url_brand.id)
model = self.request.GET.get(self.model_param)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
if url_brand:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='1', brand=url_brand)
else:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='1')
model = str(url_model.id)
if model:
queryset = queryset.filter(transport_model__id=model).distinct()
else:
if brand:
queryset = queryset.filter(brand__id=brand).distinct()
min_year = self.request.GET.get(self.year_min_param)
if min_year:
queryset = queryset.filter(year__gte=int(min_year)).distinct()
max_year = self.request.GET.get(self.year_max_param)
if max_year:
queryset = queryset.filter(year__lte=int(max_year)).distinct()
min_price = self.request.GET.get(self.price_min_param)
if min_price:
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('auction_price_rub') + F('delivery_price_rub') + F('tax_price_rub'),
output_field=fields.IntegerField()
)).filter(total_price__gte=int(min_price)).distinct()
max_price = self.request.GET.get(self.price_max_param)
if max_price:
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('auction_price_rub') + F('delivery_price_rub') + F('tax_price_rub'),
output_field=fields.IntegerField()
)).filter(total_price__lte=int(max_price)).distinct()
sort_by = self.request.GET.get(self.sort_param, self.default_sort_param)
queryset = queryset.order_by(sort_by)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# context['canonical'] = reverse('core:experience_japan')
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['year_min_query'] = self.request.GET.get(self.year_min_param)
context['year_max_query'] = self.request.GET.get(self.year_max_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
if url_brand:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='1', brand=url_brand)
else:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='1')
context['model_query'] = str(url_model.id)
context['brands'] = TransportBrand.objects.filter(
Q(transport_experience__isnull=False) & Q(transport_experience__category='1')).distinct()
filtered_queryset = self.get_queryset()
context['total_objects'] = filtered_queryset.count()
if context['brand_query']:
context['models'] = TransportModel.objects.filter(Q(transport_experience__isnull=False) &
Q(transport_experience__category='1') &
Q(transport_experience__brand__id=context[
'brand_query']) &
Q(category='1')).distinct()
return context
class ExperienceKoreaQuerySetMixin:
brand_param = 'brand'
model_param = 'model'
year_min_param = 'year_min'
year_max_param = 'year_max'
price_min_param = 'price_min'
price_max_param = 'price_max'
sort_param = 'sort'
default_sort_param = 'auction_price_rub'
def get_queryset(self):
queryset = super().get_queryset().filter(is_active=True).select_related('cover')
queryset = queryset.filter(category='2').distinct()
model = self.request.GET.get(self.model_param)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(TransportModel.objects.annotate(
clean_title=Replace('title')
), clean_title=url_model, category='2')
model = str(url_model.id)
if model:
queryset = queryset.filter(transport_model__id=model).distinct()
else:
brand = self.request.GET.get(self.brand_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.annotate(
clean_title=Replace('title')
), clean_title=url_brand)
brand = str(url_brand.id)
if brand:
queryset = queryset.filter(brand__id=brand).distinct()
min_year = self.request.GET.get(self.year_min_param)
if min_year:
queryset = queryset.filter(year__gte=int(min_year)).distinct()
max_year = self.request.GET.get(self.year_max_param)
if max_year:
queryset = queryset.filter(year__lte=int(max_year)).distinct()
min_price = self.request.GET.get(self.price_min_param)
if min_price:
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('auction_price_rub') + F('delivery_price_rub') + F('tax_price_rub'),
output_field=fields.IntegerField()
)).filter(total_price__gte=int(min_price)).distinct()
max_price = self.request.GET.get(self.price_max_param)
if max_price:
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('auction_price_rub') + F('delivery_price_rub') + F('tax_price_rub'),
output_field=fields.IntegerField()
)).filter(total_price__lte=int(max_price)).distinct()
sort_by = self.request.GET.get(self.sort_param, self.default_sort_param)
queryset = queryset.order_by(sort_by)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# context['canonical'] = reverse('core:experience_korea')
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['year_min_query'] = self.request.GET.get(self.year_min_param)
context['year_max_query'] = self.request.GET.get(self.year_max_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
context['brands'] = TransportBrand.objects.filter(
Q(transport_experience__isnull=False) & Q(transport_experience__category='2')).distinct()
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category='2', brand=url_brand)
context['model_query'] = str(url_model.id)
filtered_queryset = self.get_queryset()
context['total_objects'] = filtered_queryset.count()
if context['brand_query']:
context['models'] = TransportModel.objects.filter(Q(transport_experience__isnull=False) &
Q(transport_experience__category='2') &
Q(transport_experience__brand__id=context[
'brand_query']) &
Q(category='2')).distinct()
return context
class ExperienceMachineryQuerySetMixin:
brand_param = 'brand'
model_param = 'model'
year_min_param = 'year_min'
year_max_param = 'year_max'
price_min_param = 'price_min'
price_max_param = 'price_max'
sort_param = 'sort'
default_sort_param = 'auction_price_rub'
def get_queryset(self):
queryset = super().get_queryset().filter(is_active=True).select_related('cover')
model = self.request.GET.get(self.model_param)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(MachineryModel.objects.annotate(
clean_title=Replace('title')
), clean_title=url_model)
model = str(url_model.id)
if model:
queryset = queryset.filter(transport_model__id=model).distinct()
else:
brand = self.request.GET.get(self.brand_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = MachineryBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
).filter(clean_title=url_brand).first()
if not url_brand:
raise Http404("Объект не найден")
brand = str(url_brand.id)
if brand:
queryset = queryset.filter(brand__id=brand).distinct()
min_year = self.request.GET.get(self.year_min_param)
if min_year:
queryset = queryset.filter(year__gte=int(min_year)).distinct()
max_year = self.request.GET.get(self.year_max_param)
if max_year:
queryset = queryset.filter(year__lte=int(max_year)).distinct()
min_price = self.request.GET.get(self.price_min_param)
if min_price:
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('auction_price_rub') + F('delivery_price_rub') + F('tax_price_rub'),
output_field=fields.IntegerField()
)).filter(total_price__gte=int(min_price)).distinct()
max_price = self.request.GET.get(self.price_max_param)
if max_price:
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('auction_price_rub') + F('delivery_price_rub') + F('tax_price_rub'),
output_field=fields.IntegerField()
)).filter(total_price__lte=int(max_price)).distinct()
sort_by = self.request.GET.get(self.sort_param, self.default_sort_param)
queryset = queryset.order_by(sort_by)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# context['canonical'] = reverse('core:experience_machinery')
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['year_min_query'] = self.request.GET.get(self.year_min_param)
context['year_max_query'] = self.request.GET.get(self.year_max_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
context['brands'] = MachineryBrand.objects.filter(
Q(transport_experience__isnull=False) & ~Q(db_id='0')).distinct()
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = MachineryBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
).filter(clean_title=url_brand).first()
if not url_brand:
raise Http404("Объект не найден")
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_model = url_model.replace('-', ' ').upper()
url_model = get_object_or_404(MachineryModel.objects.annotate(
clean_title=Replace('title')
), clean_title=url_model, brand=url_brand)
context['model_query'] = str(url_model.id)
filtered_queryset = self.get_queryset()
context['total_objects'] = filtered_queryset.count()
if context['brand_query']:
context['models'] = MachineryModel.objects.filter(Q(transport_experience__isnull=False) &
Q(transport_experience__brand__id=context[
'brand_query'])).distinct()
return context
class DocumentsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['documents'] = Document.objects.all()
return context
class JapanBrandsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
brands = japan_brands_available(self.request.ip_address)
if brands:
context['brands'] = TransportBrand.objects.filter(Q(transport_models__category='1') &
Q(db_id__in=brands)).distinct()
else:
context['brands'] = TransportBrand.objects.filter(transport_models__category='1').distinct()
return context
class TruckBrandsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
brands = japan_brands_available(self.request.ip_address, True)
if brands:
context['brands'] = TransportBrand.objects.filter(Q(transport_models__category='1') &
Q(db_id__in=brands) &
Q(db_id__in=settings.TRUCK_BRANDS)).distinct()
else:
context['brands'] = TransportBrand.objects.filter(Q(transport_models__category='1') &
Q(db_id__in=settings.TRUCK_BRANDS)).distinct()
return context
class KoreaBrandsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
brands = korea_brands_available(self.request.ip_address)
if brands:
context['brands'] = TransportBrand.objects.filter(Q(transport_models__category='2') &
Q(db_id__in=brands)).distinct()
else:
context['brands'] = TransportBrand.objects.filter(transport_models__category='2').distinct()
return context
class MachineryBrandsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
brands = machinery_brands_available(self.request.ip_address)
if brands:
context['brands'] = MachineryBrand.objects.filter(Q(db_id__in=brands) & ~Q(db_id='0')).all()
else:
context['brands'] = MachineryBrand.objects.filter(~Q(db_id='0')).all()
return context
class ColorMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['colors'] = ColorFilter.objects.all()
return context
class MachineryFilterMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['types'] = MachineryFilter.objects.all()
return context
class MainBrandsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
brands = settings.MAIN_PAGE_JAPAN_BRANDS + settings.MAIN_PAGE_KOREA_BRANDS
main_brands = {}
for brand in brands:
curr_brand = TransportBrand.objects.filter(title=brand).first()
if curr_brand:
brand = brand.replace(' ', '_')
main_brands[brand] = curr_brand.id
context['main_brands'] = main_brands
return context
class MainMachineryFiltersMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['machinery_filters'] = MachineryFilter.objects.filter(on_main=True, icon__isnull=False).all()
return context
class AllCatalogLotsMixin:
page_param = 'page'
default_page_param = 1
def get_context_data(self, **kwargs):
AUCTION_ENDPOINT = settings.AUCTION_ENDPOINT
if self.request.ip_address:
AUCTION_ENDPOINT = AUCTION_ENDPOINT.replace('?json', f'?json&ip={self.request.ip_address}')
MACHINERY_ENDPOINT = settings.MACHINERY_ENDPOINT
if self.request.ip_address:
MACHINERY_ENDPOINT = MACHINERY_ENDPOINT.replace('?json', f'?json&ip={self.request.ip_address}')
context = super().get_context_data(**kwargs)
context['page'] = self.request.GET.get(self.page_param, self.default_page_param)
total_lots_quantity = 0
sql_request = f"select * from main where (status LIKE '%25not sold%25' or status='') and (auction not like '%25uss%25') and YEAR>={settings.MIN_YEAR}"
sql_request_quantity = sql_request.replace('*', 'count(*)', 1)
sql_request_quantity = sql_request_for_api(sql_request_quantity)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request_quantity)
lots_quantity = int(response.json()[0].get('TAG0'))
except:
lots_quantity = 0
total_lots_quantity += lots_quantity
page_num = int(self.request.GET.get(self.page_param, self.default_page_param))
sql_request += f' limit {(page_num - 1) * MaxListCars.AUTO_ALL_CATALOG},{MaxListCars.AUTO_ALL_CATALOG}'
sql_request = sql_request_for_api(sql_request)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request)
lots = response.json()
except:
lots = None
cars = []
if lots:
for lot_info in lots:
lot_id = lot_info.get('ID')
main_lot, created = MainLot.objects.get_or_create(db_id=lot_id)
if created:
brand_id = int(lot_info.get('MARKA_ID'))
brand_title = lot_info.get('MARKA_NAME').upper()
model_id = int(lot_info.get('MODEL_ID'))
model_title = lot_info.get('MODEL_NAME').upper()
brand, _ = TransportBrand.objects.get_or_create(db_id=brand_id, title=brand_title)
model, _ = TransportModel.objects.get_or_create(brand=brand, db_id=model_id, title=model_title,
category='1')
try:
year = int(lot_info.get('YEAR'))
except:
year = None
try:
eng_v = int(lot_info.get('ENG_V'))
except:
eng_v = None
try:
pw = int(lot_info.get('PW'))
except:
try:
pw = int(lot_info.get('PW').split(',')[0])
except:
pw = None
try:
mileage = int(lot_info.get('MILEAGE'))
except:
mileage = None
try:
start = int(lot_info.get('START'))
except:
start = None
try:
finish = int(lot_info.get('FINISH'))
except:
finish = None
try:
avg_price = int(lot_info.get('AVG_PRICE'))
except:
avg_price = None
images = lot_info.get('IMAGES').split('#')
if len(images) > 0:
cover = images[0]
else:
cover = None
if len(images) > 1:
images = '#'.join(images[1::])
else:
images = None
main_lot.lot = lot_info.get('LOT')
main_lot.auction_date = lot_info.get('AUCTION_DATE')
main_lot.auction = lot_info.get('AUCTION')
main_lot.car_model = model
main_lot.year = year
main_lot.eng_v = eng_v
main_lot.pw = pw
main_lot.town = lot_info.get('TOWN')
main_lot.kuzov = lot_info.get('KUZOV')
main_lot.grade = lot_info.get('GRADE')
main_lot.color = lot_info.get('COLOR')
main_lot.kpp = lot_info.get('KPP')
main_lot.kpp_type = lot_info.get('KPP_TYPE')
main_lot.priv = lot_info.get('PRIV')
main_lot.mileage = mileage
main_lot.equip = lot_info.get('EQUIP')
main_lot.rate = lot_info.get('RATE')
main_lot.start = start
main_lot.finish = finish
main_lot.status = lot_info.get('STATUS')
main_lot.time = lot_info.get('TIME')
main_lot.avg_price = avg_price
main_lot.avg_string = lot_info.get('AVG_STRING')
main_lot.cover = cover
main_lot.images = images
main_lot.save()
cars.append(main_lot)
sql_request = f"select * from korea where (status LIKE '%25not sold%25' or status='') and YEAR>={settings.MIN_YEAR}"
sql_request_quantity = sql_request.replace('*', 'count(*)', 1)
sql_request_quantity = sql_request_for_api(sql_request_quantity)
try:
response = requests.get(settings.AUCTION_ENDPOINT + sql_request_quantity)
lots_quantity = int(response.json()[0].get('TAG0'))
except:
lots_quantity = 0
total_lots_quantity += lots_quantity
page_num = int(self.request.GET.get(self.page_param, self.default_page_param))
sql_request += f' limit {(page_num - 1) * MaxListCars.AUTO_ALL_CATALOG},{MaxListCars.AUTO_ALL_CATALOG}'
sql_request = sql_request_for_api(sql_request)
try:
response = requests.get(AUCTION_ENDPOINT + sql_request)
lots = response.json()
except:
lots = None
if lots:
for lot_info in lots:
lot_id = lot_info.get('ID')
main_lot, created = KoreaLot.objects.get_or_create(db_id=lot_id)
if created:
brand_id = int(lot_info.get('MARKA_ID'))
brand_title = lot_info.get('MARKA_NAME').upper()
model_id = int(lot_info.get('MODEL_ID'))
model_title = lot_info.get('MODEL_NAME').upper()
brand, _ = TransportBrand.objects.get_or_create(db_id=brand_id, title=brand_title)
model, _ = TransportModel.objects.get_or_create(brand=brand, db_id=model_id, title=model_title,
category='2')
try:
year = int(lot_info.get('YEAR'))
except:
year = None
try:
eng_v = int(lot_info.get('ENG_V'))
except:
eng_v = None
try:
pw = int(lot_info.get('PW'))
except:
try:
pw = int(lot_info.get('PW').split(',')[0])
except:
pw = None
try:
mileage = int(lot_info.get('MILEAGE'))
except:
mileage = None
try:
start = int(lot_info.get('START'))
except:
start = None
try:
finish = int(lot_info.get('FINISH'))
except:
finish = None
try:
avg_price = int(lot_info.get('AVG_PRICE'))
except:
avg_price = None
images = lot_info.get('IMAGES').split('#')
if len(images) > 0:
cover = images[0]
else:
cover = None
if len(images) > 1:
images = '#'.join(images[1::])
else:
images = None
main_lot.lot = lot_info.get('LOT')
main_lot.auction_date = lot_info.get('AUCTION_DATE')
main_lot.auction = lot_info.get('AUCTION')
main_lot.car_model = model
main_lot.year = year
main_lot.eng_v = eng_v
main_lot.pw = pw
main_lot.kuzov = lot_info.get('KUZOV')
main_lot.grade = lot_info.get('GRADE')
main_lot.color = lot_info.get('COLOR')
main_lot.kpp = lot_info.get('KPP')
main_lot.kpp_type = lot_info.get('KPP_TYPE')
main_lot.priv = lot_info.get('PRIV')
main_lot.mileage = mileage
main_lot.equip = lot_info.get('EQUIP')
main_lot.rate = lot_info.get('RATE')
main_lot.start = start
main_lot.finish = finish
main_lot.status = lot_info.get('STATUS')
main_lot.time = lot_info.get('TIME')
main_lot.avg_price = avg_price
main_lot.avg_string = lot_info.get('AVG_STRING')
main_lot.cover = cover
main_lot.images = images
main_lot.save()
cars.append(main_lot)
sql_request = f"select * from hdm where (status LIKE '%25not sold%25' or status='')"
sql_request_quantity = sql_request.replace('*', 'count(*)', 1)
sql_request_quantity = sql_request_for_api(sql_request_quantity)
try:
response = requests.get(MACHINERY_ENDPOINT + sql_request_quantity)
lots_quantity = int(response.json()[0].get('TAG0'))
except:
lots_quantity = 0
total_lots_quantity += lots_quantity
page_num = int(self.request.GET.get(self.page_param, self.default_page_param))
sql_request += f' limit {(page_num - 1) * MaxListCars.MACHINERY_ALL_CATALOG},{MaxListCars.MACHINERY_ALL_CATALOG}'
sql_request = sql_request_for_api(sql_request)
try:
response = requests.get(MACHINERY_ENDPOINT + sql_request)
lots = response.json()
except:
lots = None
if lots:
for lot_info in lots:
lot_id = lot_info.get('ID')
main_lot, created = MachineryLot.objects.get_or_create(db_id=lot_id)
if created:
brand_id = int(lot_info.get('MARKA_ID'))
brand_title = lot_info.get('MARKA_NAME').upper()
model_title = lot_info.get('MODEL_NAME').upper()
brand, _ = MachineryBrand.objects.get_or_create(db_id=brand_id, title=brand_title)
model, _ = MachineryModel.objects.get_or_create(brand=brand, title=model_title)
try:
year = int(lot_info.get('YEAR'))
except:
year = None
try:
mileage = int(lot_info.get('MILEAGE'))
except:
mileage = None
try:
price = int(lot_info.get('PRICE'))
except:
price = None
try:
finish = int(lot_info.get('FINISH'))
except:
finish = None
images = lot_info.get('IMAGES').split('#')
if len(images) > 0:
cover = images[0]
else:
cover = None
if len(images) > 1:
images = '#'.join(images[1::])
else:
images = None
machinery_group = lot_info.get('CATEGORY')
machinery_type = None
if machinery_group:
curr_group = MachineryGroup.objects.filter(title=machinery_group.upper()).first()
if curr_group:
machinery_type = curr_group.filters.first()
main_lot.lot = lot_info.get('LOT')
main_lot.auction_date = lot_info.get('AUCTION_DATE')
main_lot.auction = lot_info.get('AUCTION')
main_lot.group = lot_info.get('GROUP')
main_lot.category = machinery_group
main_lot.gg = lot_info.get('GG')
main_lot.cc = lot_info.get('CC')
main_lot.machinery_model = model
main_lot.year = year
main_lot.grade = lot_info.get('GRADE')
main_lot.kpp = lot_info.get('KPP')
main_lot.priv = lot_info.get('PRIV')
main_lot.mileage = mileage
main_lot.rate = lot_info.get('RATE')
main_lot.price = price
main_lot.finish = finish
main_lot.status = lot_info.get('STATUS')
main_lot.cover = cover
main_lot.images = images
main_lot.machinery_filter = machinery_type
main_lot.save()
cars.append(main_lot)
random.shuffle(cars)
context['lots'] = cars
context['total_lots'] = total_lots_quantity
# context['canonical'] = reverse('core:catalog_all')
return context
class StockAutoQuerySetMixin:
brand_param = 'brand'
model_param = 'model'
city_param = 'city'
year_min_param = 'year_min'
year_max_param = 'year_max'
price_min_param = 'price_min'
price_max_param = 'price_max'
engine_param = 'engine'
import_param = 'import'
sort_param = 'sort'
default_sort_param = 'price'
def get_queryset(self):
queryset = super().get_queryset().filter(is_active=True).select_related('cover')
brand = self.request.GET.get(self.brand_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
brand = str(url_brand.id)
model = self.request.GET.get(self.model_param)
if url_model := self.kwargs.get('model'):
url_category = url_model[-1]
if url_category == '0':
url_category = '1'
url_model = url_model[:-2]
url_model = url_model.replace('-', ' ').upper()
if url_brand:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category=url_category, brand=url_brand)
else:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category=url_category)
model = str(url_model.id)
if model:
queryset = queryset.filter(transport_model__id=model).distinct()
else:
if brand:
queryset = queryset.filter(brand__id=brand).distinct()
city = self.request.GET.get(self.city_param)
if city:
queryset = queryset.filter(city__isnull=False, city__slug=city).distinct()
engine = self.request.GET.get(self.engine_param)
if engine:
queryset = queryset.filter(engine__isnull=False, engine__slug=engine).distinct()
import_type = self.request.GET.get(self.import_param)
if import_type:
queryset = queryset.filter(import_type__isnull=False, import_type__slug=import_type).distinct()
min_year = self.request.GET.get(self.year_min_param)
if min_year:
queryset = queryset.filter(year__gte=int(min_year)).distinct()
max_year = self.request.GET.get(self.year_max_param)
if max_year:
queryset = queryset.filter(year__lte=int(max_year)).distinct()
min_price = self.request.GET.get(self.price_min_param)
if min_price:
queryset = queryset.filter(price=int(min_price)).distinct()
max_price = self.request.GET.get(self.price_max_param)
if max_price:
queryset = queryset.filter(price__lte=int(max_price)).distinct()
sort_by = self.request.GET.get(self.sort_param, self.default_sort_param)
queryset = queryset.order_by(sort_by)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# context['canonical'] = reverse('core:experience_japan')
context['sort_query'] = self.request.GET.get(self.sort_param, self.default_sort_param)
context['year_min_query'] = self.request.GET.get(self.year_min_param)
context['year_max_query'] = self.request.GET.get(self.year_max_param)
context['price_min_query'] = self.request.GET.get(self.price_min_param)
context['price_max_query'] = self.request.GET.get(self.price_max_param)
context['brand_query'] = self.request.GET.get(self.brand_param)
context['model_query'] = self.request.GET.get(self.model_param)
context['city_query'] = self.request.GET.get(self.city_param)
context['engine_query'] = self.request.GET.get(self.engine_param)
context['import_query'] = self.request.GET.get(self.import_param)
if url_brand := self.kwargs.get('brand'):
url_brand = url_brand.replace('-', ' ').upper()
url_brand = get_object_or_404(TransportBrand.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_brand)
context['brand_query'] = str(url_brand.id)
if url_model := self.kwargs.get('model'):
url_category = url_model[-1]
if url_category == '0':
url_category = '1'
url_model = url_model[:-2]
url_model = url_model.replace('-', ' ').upper()
if url_brand:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category=url_category, brand=url_brand)
else:
url_model = get_object_or_404(TransportModel.objects.filter(~Q(db_id="0")).annotate(
clean_title=Replace('title')
), clean_title=url_model, category=url_category)
context['model_query'] = str(url_model.id)
context['brands'] = TransportBrand.objects.filter(autos_in_stock__isnull=False).distinct()
filtered_queryset = self.get_queryset()
context['total_objects'] = filtered_queryset.count()
if context['brand_query']:
context['models'] = TransportModel.objects.filter(Q(autos_in_stock__isnull=False) &
Q(autos_in_stock__brand__id=context['brand_query'])
).distinct()
return context
class YearsMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
curr_year = datetime.datetime.utcnow().year
context['years'] = range(settings.MIN_YEAR, curr_year + 1)
return context