views.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from django.shortcuts import render, get_object_or_404
  2. from django.template import loader
  3. from django.urls import reverse
  4. from django.http import HttpResponse
  5. from django.utils.html import strip_tags
  6. from django.core.paginator import Paginator
  7. from django.db.models import Q
  8. import json
  9. from core.views import gen_page_base
  10. from blog.models import Blog, Cat_Blog, Blog_search_Form
  11. from blog.seo_helpers import SEOMetadata
  12. def blog_index(request, bcat):
  13. """Vue pour la liste des articles du blog"""
  14. template = loader.get_template('listing.html')
  15. page = gen_page_base()
  16. # Recherche
  17. b_search = request.GET.get('b_search')
  18. if b_search:
  19. page.blog_search = Blog_search_Form(initial={'b_search': b_search})
  20. q = Q(b_titre__icontains=b_search) | Q(b_mots_clefs__icontains=b_search) | Q(b_description__icontains=b_search)
  21. else:
  22. page.blog_search = Blog_search_Form()
  23. # Filtrage des articles
  24. category = None
  25. if bcat == "index":
  26. if b_search:
  27. blog_art = Blog.objects.filter(b_publier=True).filter(q).order_by('-b_publdate')[:5]
  28. else:
  29. blog_art = Blog.objects.filter(b_publier=True).order_by('-b_publdate')[:5]
  30. page.blog_cat = Cat_Blog.objects.all()[:15]
  31. elif bcat == "all":
  32. blog_art = Blog.objects.filter(b_publier=True).order_by('-b_publdate')
  33. page.blog_cat = Cat_Blog.objects.all()[:15]
  34. else:
  35. category = get_object_or_404(Cat_Blog, cb_titre_slgify=bcat)
  36. if b_search:
  37. blog_art = Blog.objects.filter(b_publier=True, b_cat__cb_titre_slgify=bcat).filter(q).order_by('-b_publdate')
  38. else:
  39. blog_art = Blog.objects.filter(b_publier=True, b_cat__cb_titre_slgify=bcat).order_by('-b_publdate')
  40. page.blog_cat = Cat_Blog.objects.filter(cb_titre_slgify=bcat)[:15]
  41. page.retour = "blog_index"
  42. # Pagination
  43. paginator = Paginator(blog_art, 15)
  44. page_number = request.GET.get('page')
  45. page.blog_art = paginator.get_page(page_number)
  46. page.blog_art.nbpage = range(page.blog_art.paginator.num_pages)
  47. # Top 10 articles
  48. page.blog_top10 = Blog.objects.filter(b_publier=True).order_by('-b_reading')[:10]
  49. # SEO Metadata
  50. seo_helper = SEOMetadata(request)
  51. seo = seo_helper.get_listing_metadata(category)
  52. page.seo = seo
  53. page.seo_json = json.dumps(seo.get('schema', {})) if 'schema' in seo else '{}'
  54. # Configuration page traditionnelle
  55. page.p_adresse = reverse('blog_index')
  56. page.p_titre = category.cb_titre if category else "Les articles du Blog"
  57. page.p_contenu = ""
  58. 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"
  59. page.p_description = strip_tags(page.p_right)
  60. page.p_mots_clefs = ""
  61. for cat in page.blog_cat.all():
  62. page.p_mots_clefs += cat.cb_titre + ', '
  63. # Fil d'Ariane (Breadcrumbs)
  64. breadcrumbs = [
  65. {'name': 'Accueil', 'url': reverse('core_index')},
  66. {'name': 'Blog', 'url': reverse('blog_index')},
  67. ]
  68. if category:
  69. breadcrumbs.append({
  70. 'name': category.cb_titre,
  71. 'url': reverse('blog_tag', args=[category.cb_titre_slgify])
  72. })
  73. page.breadcrumbs = breadcrumbs
  74. html = template.render({
  75. 'page': page,
  76. 'user': request.user,
  77. }, request)
  78. return HttpResponse(html)
  79. def blog_play(request, bart):
  80. """Vue pour afficher un article de blog"""
  81. template = loader.get_template('read.html')
  82. page = gen_page_base()
  83. # Récupération de l'article avec optimisation des requêtes
  84. article = get_object_or_404(
  85. Blog.objects.prefetch_related('b_cat'),
  86. b_titre_slugify=bart,
  87. b_publier=True
  88. )
  89. # Incrémenter les lectures
  90. article.b_reading += 1
  91. article.save(update_fields=['b_reading'])
  92. # SEO Metadata
  93. seo_helper = SEOMetadata(request, article)
  94. seo = seo_helper.get_blog_metadata(article)
  95. page.seo = seo
  96. page.seo_json = json.dumps(seo.get('schema', {}))
  97. # Configuration page traditionnelle
  98. page.p_adresse = reverse('blog_play', args=[bart])
  99. page.p_titre = article.b_titre
  100. page.p_contenu = article.b_description
  101. page.p_description = strip_tags(article.b_description)
  102. page.p_right = article.b_right if article.b_right else " "
  103. page.blog_art = [article]
  104. page.c_card_mp = "True"
  105. # Mots clés
  106. page.p_mots_clefs = ""
  107. for cat in article.b_cat.all():
  108. page.p_mots_clefs += cat.cb_titre + ', '
  109. # Fil d'Ariane (Breadcrumbs)
  110. breadcrumbs = [
  111. {'name': 'Accueil', 'url': reverse('core_index')},
  112. {'name': 'Blog', 'url': reverse('blog_index')},
  113. {'name': article.b_titre, 'url': reverse('blog_play', args=[bart])}
  114. ]
  115. # Ajouter les catégories au breadcrumb si présent
  116. first_category = article.b_cat.first()
  117. if first_category:
  118. breadcrumbs.insert(2, {
  119. 'name': first_category.cb_titre,
  120. 'url': reverse('blog_tag', args=[first_category.cb_titre_slgify])
  121. })
  122. page.breadcrumbs = breadcrumbs
  123. html = template.render({
  124. 'page': page,
  125. 'user': request.user,
  126. }, request)
  127. return HttpResponse(html)
  128. def blog_update(request):
  129. """
  130. ATTENTION: Cette fonction est obsolète et dangereuse!
  131. À supprimer en production ou protéger avec authentification admin.
  132. """
  133. # Cette fonction ne devrait PAS être accessible en production
  134. if not request.user.is_staff:
  135. return HttpResponse("Accès refusé", status=403)
  136. arts = Blog.objects.all()
  137. for art in arts:
  138. # Nettoyage des caractères mal encodés
  139. art.b_contenu = art.b_contenu.replace('é"', 'é').replace('à"', 'à').replace('ê"', 'ê').replace('è"', 'è').replace('ô"', 'ô').replace('«"', '«').replace('»"', '»')
  140. art.save()
  141. return HttpResponse("Mise à jour terminée")