176 lines
6.2 KiB
Python
176 lines
6.2 KiB
Python
|
from django.shortcuts import render, get_object_or_404
|
||
|
from django.db.models import Q
|
||
|
from hub.services.models import (
|
||
|
Article,
|
||
|
Service,
|
||
|
ConsultingPartner,
|
||
|
CloudProvider,
|
||
|
)
|
||
|
|
||
|
|
||
|
def article_list(request):
|
||
|
"""View for listing articles with filtering capabilities"""
|
||
|
# Get basic filter parameters
|
||
|
search_query = request.GET.get("search", "")
|
||
|
service_id = request.GET.get("service", "")
|
||
|
consulting_partner_id = request.GET.get("consulting_partner", "")
|
||
|
cloud_provider_id = request.GET.get("cloud_provider", "")
|
||
|
|
||
|
# Start with all published articles
|
||
|
all_articles = Article.objects.filter(is_published=True)
|
||
|
articles = all_articles
|
||
|
|
||
|
# Apply filters based on request parameters
|
||
|
if search_query:
|
||
|
articles = articles.filter(
|
||
|
Q(title__icontains=search_query)
|
||
|
| Q(excerpt__icontains=search_query)
|
||
|
| Q(content__icontains=search_query)
|
||
|
| Q(meta_keywords__icontains=search_query)
|
||
|
)
|
||
|
|
||
|
if service_id:
|
||
|
articles = articles.filter(related_service__id=service_id)
|
||
|
|
||
|
if consulting_partner_id:
|
||
|
articles = articles.filter(related_consulting_partner__id=consulting_partner_id)
|
||
|
|
||
|
if cloud_provider_id:
|
||
|
articles = articles.filter(related_cloud_provider__id=cloud_provider_id)
|
||
|
|
||
|
# Order articles: featured first, then by creation date (newest first)
|
||
|
articles = articles.order_by(
|
||
|
"-is_featured", # Featured first (True before False)
|
||
|
"-created_at", # Newest first
|
||
|
)
|
||
|
|
||
|
# Create base querysets for each filter type that apply all OTHER current filters
|
||
|
# This way, each filter shows options that would return results if selected
|
||
|
|
||
|
# For service filter options, apply all other filters except service
|
||
|
service_filter_base = all_articles
|
||
|
if search_query:
|
||
|
service_filter_base = service_filter_base.filter(
|
||
|
Q(title__icontains=search_query)
|
||
|
| Q(excerpt__icontains=search_query)
|
||
|
| Q(content__icontains=search_query)
|
||
|
| Q(meta_keywords__icontains=search_query)
|
||
|
)
|
||
|
if consulting_partner_id:
|
||
|
service_filter_base = service_filter_base.filter(
|
||
|
related_consulting_partner__id=consulting_partner_id
|
||
|
)
|
||
|
if cloud_provider_id:
|
||
|
service_filter_base = service_filter_base.filter(
|
||
|
related_cloud_provider__id=cloud_provider_id
|
||
|
)
|
||
|
|
||
|
# For consulting partner filter options, apply all other filters except consulting_partner
|
||
|
cp_filter_base = all_articles
|
||
|
if search_query:
|
||
|
cp_filter_base = cp_filter_base.filter(
|
||
|
Q(title__icontains=search_query)
|
||
|
| Q(excerpt__icontains=search_query)
|
||
|
| Q(content__icontains=search_query)
|
||
|
| Q(meta_keywords__icontains=search_query)
|
||
|
)
|
||
|
if service_id:
|
||
|
cp_filter_base = cp_filter_base.filter(related_service__id=service_id)
|
||
|
if cloud_provider_id:
|
||
|
cp_filter_base = cp_filter_base.filter(
|
||
|
related_cloud_provider__id=cloud_provider_id
|
||
|
)
|
||
|
|
||
|
# For cloud provider filter options, apply all other filters except cloud_provider
|
||
|
cloud_filter_base = all_articles
|
||
|
if search_query:
|
||
|
cloud_filter_base = cloud_filter_base.filter(
|
||
|
Q(title__icontains=search_query)
|
||
|
| Q(excerpt__icontains=search_query)
|
||
|
| Q(content__icontains=search_query)
|
||
|
| Q(meta_keywords__icontains=search_query)
|
||
|
)
|
||
|
if service_id:
|
||
|
cloud_filter_base = cloud_filter_base.filter(related_service__id=service_id)
|
||
|
if consulting_partner_id:
|
||
|
cloud_filter_base = cloud_filter_base.filter(
|
||
|
related_consulting_partner__id=consulting_partner_id
|
||
|
)
|
||
|
|
||
|
# Get available services, consulting partners and cloud providers that would return results if selected
|
||
|
available_services = Service.objects.filter(
|
||
|
disable_listing=False,
|
||
|
id__in=service_filter_base.values_list(
|
||
|
"related_service__id", flat=True
|
||
|
).distinct(),
|
||
|
).distinct()
|
||
|
|
||
|
available_consulting_partners = ConsultingPartner.objects.filter(
|
||
|
disable_listing=False,
|
||
|
id__in=cp_filter_base.values_list(
|
||
|
"related_consulting_partner__id", flat=True
|
||
|
).distinct(),
|
||
|
).distinct()
|
||
|
|
||
|
available_cloud_providers = CloudProvider.objects.filter(
|
||
|
disable_listing=False,
|
||
|
id__in=cloud_filter_base.values_list(
|
||
|
"related_cloud_provider__id", flat=True
|
||
|
).distinct(),
|
||
|
).distinct()
|
||
|
|
||
|
context = {
|
||
|
"articles": articles,
|
||
|
"available_services": available_services,
|
||
|
"available_consulting_partners": available_consulting_partners,
|
||
|
"available_cloud_providers": available_cloud_providers,
|
||
|
"search_query": search_query,
|
||
|
}
|
||
|
|
||
|
return render(request, "services/article_list.html", context)
|
||
|
|
||
|
|
||
|
def article_detail(request, slug):
|
||
|
"""View for displaying article details"""
|
||
|
article = get_object_or_404(
|
||
|
Article.objects.select_related(
|
||
|
"author",
|
||
|
"related_service",
|
||
|
"related_consulting_partner",
|
||
|
"related_cloud_provider"
|
||
|
).filter(is_published=True),
|
||
|
slug=slug,
|
||
|
)
|
||
|
|
||
|
# Get related articles (same service, partner, or provider)
|
||
|
related_articles = Article.objects.filter(
|
||
|
is_published=True
|
||
|
).exclude(id=article.id)
|
||
|
|
||
|
if article.related_service:
|
||
|
related_articles = related_articles.filter(
|
||
|
related_service=article.related_service
|
||
|
)
|
||
|
elif article.related_consulting_partner:
|
||
|
related_articles = related_articles.filter(
|
||
|
related_consulting_partner=article.related_consulting_partner
|
||
|
)
|
||
|
elif article.related_cloud_provider:
|
||
|
related_articles = related_articles.filter(
|
||
|
related_cloud_provider=article.related_cloud_provider
|
||
|
)
|
||
|
else:
|
||
|
# If no specific relation, get other general articles
|
||
|
related_articles = related_articles.filter(
|
||
|
related_service__isnull=True,
|
||
|
related_consulting_partner__isnull=True,
|
||
|
related_cloud_provider__isnull=True
|
||
|
)
|
||
|
|
||
|
related_articles = related_articles.order_by("-created_at")[:3]
|
||
|
|
||
|
context = {
|
||
|
"article": article,
|
||
|
"related_articles": related_articles,
|
||
|
}
|
||
|
return render(request, "services/article_detail.html", context)
|