articles
This commit is contained in:
parent
01d35a461b
commit
d1926cfc17
12 changed files with 862 additions and 4 deletions
176
hub/services/views/articles.py
Normal file
176
hub/services/views/articles.py
Normal file
|
@ -0,0 +1,176 @@
|
|||
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)
|
Loading…
Add table
Add a link
Reference in a new issue