| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- from django.shortcuts import render, get_object_or_404
- from django.template import loader
- from django.urls import reverse
- from django.http import HttpResponse
- from django.utils.html import strip_tags
- from django.core.paginator import Paginator
- from django.db.models import Q
- import json
- from core.views import gen_page_base
- from blog.models import Blog, Cat_Blog, Blog_search_Form
- from blog.seo_helpers import SEOMetadata
- def blog_index(request, bcat):
- """Vue pour la liste des articles du blog"""
- template = loader.get_template('listing.html')
- page = gen_page_base()
-
- # Recherche
- b_search = request.GET.get('b_search')
- if b_search:
- page.blog_search = Blog_search_Form(initial={'b_search': b_search})
- q = Q(b_titre__icontains=b_search) | Q(b_mots_clefs__icontains=b_search) | Q(b_description__icontains=b_search)
- else:
- page.blog_search = Blog_search_Form()
-
- # Filtrage des articles
- category = None
- if bcat == "index":
- if b_search:
- blog_art = Blog.objects.filter(b_publier=True).filter(q).order_by('-b_publdate')[:5]
- else:
- blog_art = Blog.objects.filter(b_publier=True).order_by('-b_publdate')[:5]
- page.blog_cat = Cat_Blog.objects.all()[:15]
- elif bcat == "all":
- blog_art = Blog.objects.filter(b_publier=True).order_by('-b_publdate')
- page.blog_cat = Cat_Blog.objects.all()[:15]
- else:
- category = get_object_or_404(Cat_Blog, cb_titre_slgify=bcat)
- if b_search:
- blog_art = Blog.objects.filter(b_publier=True, b_cat__cb_titre_slgify=bcat).filter(q).order_by('-b_publdate')
- else:
- blog_art = Blog.objects.filter(b_publier=True, b_cat__cb_titre_slgify=bcat).order_by('-b_publdate')
- page.blog_cat = Cat_Blog.objects.filter(cb_titre_slgify=bcat)[:15]
- page.retour = "blog_index"
-
- # Pagination
- paginator = Paginator(blog_art, 15)
- page_number = request.GET.get('page')
- page.blog_art = paginator.get_page(page_number)
- page.blog_art.nbpage = range(page.blog_art.paginator.num_pages)
-
- # Top 10 articles
- page.blog_top10 = Blog.objects.filter(b_publier=True).order_by('-b_reading')[:10]
-
- # SEO Metadata
- seo_helper = SEOMetadata(request)
- seo = seo_helper.get_listing_metadata(category)
- page.seo = seo
- page.seo_json = json.dumps(seo.get('schema', {})) if 'schema' in seo else '{}'
-
- # Configuration page traditionnelle
- page.p_adresse = reverse('blog_index')
- page.p_titre = category.cb_titre if category else "Les articles du Blog"
- page.p_contenu = ""
- page.p_right = f"Retrouvez tous les articles de la catégorie {category.cb_titre}" if category else "Retrouvez tous les articles de mon blog"
- page.p_description = strip_tags(page.p_right)
- page.p_mots_clefs = ""
-
- for cat in page.blog_cat.all():
- page.p_mots_clefs += cat.cb_titre + ', '
-
- # Fil d'Ariane (Breadcrumbs)
- breadcrumbs = [
- {'name': 'Accueil', 'url': reverse('core_index')},
- {'name': 'Blog', 'url': reverse('blog_index')},
- ]
- if category:
- breadcrumbs.append({
- 'name': category.cb_titre,
- 'url': reverse('blog_tag', args=[category.cb_titre_slgify])
- })
- page.breadcrumbs = breadcrumbs
-
- html = template.render({
- 'page': page,
- 'user': request.user,
- }, request)
-
- return HttpResponse(html)
- def blog_play(request, bart):
- """Vue pour afficher un article de blog"""
- template = loader.get_template('read.html')
- page = gen_page_base()
-
- # Récupération de l'article avec optimisation des requêtes
- article = get_object_or_404(
- Blog.objects.prefetch_related('b_cat'),
- b_titre_slugify=bart,
- b_publier=True
- )
-
- # Incrémenter les lectures
- article.b_reading += 1
- article.save(update_fields=['b_reading'])
-
- # SEO Metadata
- seo_helper = SEOMetadata(request, article)
- seo = seo_helper.get_blog_metadata(article)
- page.seo = seo
- page.seo_json = json.dumps(seo.get('schema', {}))
-
- # Configuration page traditionnelle
- page.p_adresse = reverse('blog_play', args=[bart])
- page.p_titre = article.b_titre
- page.p_contenu = article.b_description
- page.p_description = strip_tags(article.b_description)
- page.p_right = article.b_right if article.b_right else " "
- page.blog_art = [article]
- page.c_card_mp = "True"
-
- # Mots clés
- page.p_mots_clefs = ""
- for cat in article.b_cat.all():
- page.p_mots_clefs += cat.cb_titre + ', '
-
- # Fil d'Ariane (Breadcrumbs)
- breadcrumbs = [
- {'name': 'Accueil', 'url': reverse('core_index')},
- {'name': 'Blog', 'url': reverse('blog_index')},
- {'name': article.b_titre, 'url': reverse('blog_play', args=[bart])}
- ]
-
- # Ajouter les catégories au breadcrumb si présent
- first_category = article.b_cat.first()
- if first_category:
- breadcrumbs.insert(2, {
- 'name': first_category.cb_titre,
- 'url': reverse('blog_tag', args=[first_category.cb_titre_slgify])
- })
-
- page.breadcrumbs = breadcrumbs
-
- html = template.render({
- 'page': page,
- 'user': request.user,
- }, request)
-
- return HttpResponse(html)
- def blog_update(request):
- """
- ATTENTION: Cette fonction est obsolète et dangereuse!
- À supprimer en production ou protéger avec authentification admin.
- """
- # Cette fonction ne devrait PAS être accessible en production
- if not request.user.is_staff:
- return HttpResponse("Accès refusé", status=403)
-
- arts = Blog.objects.all()
- for art in arts:
- # Nettoyage des caractères mal encodés
- art.b_contenu = art.b_contenu.replace('é"', 'é').replace('à"', 'à').replace('ê"', 'ê').replace('è"', 'è').replace('ô"', 'ô').replace('«"', '«').replace('»"', '»')
- art.save()
-
- return HttpResponse("Mise à jour terminée")
|