def adslist(request):
ads_list = Ad.objects.filter(status__name='approved', is_active=True)
category_title = request.GET.get('category')
if category_title:
try:
selected_category = Category.objects.get(title=category_title)
subcategories = Category.objects.filter(Q(parent=selected_category) | Q(pk=selected_category.pk))
ads_list = ads_list.filter(category__in=subcategories)
except Category.DoesNotExist:
ads_list = Ad.objects.none()
city_name = request.GET.get('city')
if city_name:
ads_list = ads_list.filter(city__name=city_name)
# اضافه کردن is_still_featured برای شناسایی آگهیهای ویژه
ads_list = ads_list.annotate(
is_still_featured=Case(
When(featured_until__gt=timezone.now(), then=Value(True)),
default=Value(False),
output_field=BooleanField()
)
)
# مرتبسازی: اول ویژهها، بعد اولویت پلن، بعد انتخاب کاربر
sort = request.GET.get('sort', 'newest')
if sort == 'newest':
ads_list = ads_list.order_by('-is_still_featured', '-plan__priority', '-created_at')
elif sort == 'oldest':
ads_list = ads_list.order_by('-is_still_featured', '-plan__priority', 'created_at')
elif sort == 'popular':
ads_list = ads_list.order_by('-is_still_featured', '-plan__priority', '-views')
paginator = Paginator(ads_list, 6)
page_number = request.GET.get('page')
ads = paginator.get_page(page_number)
categories = Category.objects.all().exclude(title="پول")
cities = City.objects.order_by('?')[:5]
cities_side = City.objects.all()
ads_with_images = [
{
'ad': ad,
'image_urls': [image.image.url for image in ad.images.all()]
}
for ad in ads
]
query_params = request.GET.copy()
if 'page' in query_params:
query_params.pop('page')
extra_query = query_params.urlencode()
if extra_query:
extra_query = '&' + extra_query
context = {
'ads': ads,
'ads_with_images': ads_with_images,
'categories': categories,
'cities_side': cities_side,
'cities': cities,
'selected_category': category_title,
'selected_city': city_name,
'selected_sort': sort,
'extra_query': extra_query,
'now': timezone.now()
}
return render(request, 'adslist.html', context)
آگهی مشابهی یافت نشد.