|
@@ -1,120 +1,170 @@
|
|
|
-from django.shortcuts import render
|
|
|
|
|
|
|
+from django.shortcuts import render, get_object_or_404
|
|
|
from django.template import loader
|
|
from django.template import loader
|
|
|
from django.urls import reverse
|
|
from django.urls import reverse
|
|
|
-
|
|
|
|
|
-from django.http import HttpResponse, HttpResponseRedirect
|
|
|
|
|
|
|
+from django.http import HttpResponse
|
|
|
from django.utils.html import strip_tags
|
|
from django.utils.html import strip_tags
|
|
|
-
|
|
|
|
|
from django.core.paginator import Paginator
|
|
from django.core.paginator import Paginator
|
|
|
-
|
|
|
|
|
-from django.contrib import messages
|
|
|
|
|
-from django.contrib.auth import authenticate, login, logout
|
|
|
|
|
-from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
|
|
|
|
|
-from django.contrib.auth.models import User
|
|
|
|
|
-
|
|
|
|
|
from django.db.models import Q
|
|
from django.db.models import Q
|
|
|
|
|
+import json
|
|
|
|
|
|
|
|
-#from blog.forms import *
|
|
|
|
|
-from core.views import gen_page_base, gen_page_sys
|
|
|
|
|
-from blog.models import *
|
|
|
|
|
-
|
|
|
|
|
-def blog_index(request, bcat):
|
|
|
|
|
-
|
|
|
|
|
-#print(bcat)
|
|
|
|
|
-
|
|
|
|
|
- template = loader.get_template('listing.html')
|
|
|
|
|
- page = gen_page_base()
|
|
|
|
|
- page.p_adresse = reverse('blog_index')
|
|
|
|
|
- page.p_titre = "Les articles du Blog"
|
|
|
|
|
- page.p_contenu = ""
|
|
|
|
|
- page.p_right = "Retrouvez les tous les articles de mon blog"
|
|
|
|
|
- page.p_description = strip_tags(page.p_right)
|
|
|
|
|
- page.p_mots_clefs = "blog, news, "
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- b_search = request.GET.get('b_search')
|
|
|
|
|
-
|
|
|
|
|
- if b_search != None:
|
|
|
|
|
- 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()
|
|
|
|
|
- if bcat == "index":
|
|
|
|
|
- if b_search != None:
|
|
|
|
|
- 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]
|
|
|
|
|
|
|
+from core.views import gen_page_base
|
|
|
|
|
+from blog.models import Blog, Cat_Blog, Blog_search_Form
|
|
|
|
|
+from blog.seo_helpers import SEOMetadata
|
|
|
|
|
|
|
|
- elif bcat == "all":
|
|
|
|
|
- blog_art = Blog.objects.filter( b_publier = True ).order_by( '-b_publdate' )
|
|
|
|
|
- page.blog_cat = Cat_Blog.objects.all()[:15]
|
|
|
|
|
- else :
|
|
|
|
|
- if b_search != None:
|
|
|
|
|
- blog_art = Blog.objects.filter( b_publier = True ).filter( b_cat__cb_titre_slgify = bcat ).filter(q).order_by( '-b_publdate' )
|
|
|
|
|
- else :
|
|
|
|
|
- blog_art = Blog.objects.filter( b_publier = True ).filter( 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"
|
|
|
|
|
|
|
|
|
|
- paginator = Paginator(blog_art, 15)
|
|
|
|
|
- page.number = request.GET.get('page')
|
|
|
|
|
-
|
|
|
|
|
- page.blog_art = paginator.get_page(page.number)
|
|
|
|
|
- #print(page.blog_art.paginator.num_pages)
|
|
|
|
|
-
|
|
|
|
|
- page.blog_art.nbpage = range(page.blog_art.paginator.num_pages)
|
|
|
|
|
-
|
|
|
|
|
- for cat in page.blog_cat.all():
|
|
|
|
|
- page.p_mots_clefs = page.p_mots_clefs + cat.cb_titre + ', '
|
|
|
|
|
-
|
|
|
|
|
- page.blog_top10 = Blog.objects.filter( b_publier = True ).order_by( '-b_reading' )[:10]
|
|
|
|
|
|
|
+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)
|
|
|
|
|
|
|
|
- html = template.render({
|
|
|
|
|
- 'page': page,
|
|
|
|
|
- 'user': request.user,
|
|
|
|
|
- }, request)
|
|
|
|
|
-
|
|
|
|
|
- return HttpResponse(html)
|
|
|
|
|
|
|
|
|
|
def blog_play(request, bart):
|
|
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)
|
|
|
|
|
|
|
|
- template = loader.get_template('read.html')
|
|
|
|
|
- page = gen_page_base()
|
|
|
|
|
- page.p_adresse = reverse('blog_index')
|
|
|
|
|
- page.blog_art = Blog.objects.filter(b_titre_slugify = bart)[:1]
|
|
|
|
|
- page.c_card_mp = "True"
|
|
|
|
|
-
|
|
|
|
|
- for art in page.blog_art:
|
|
|
|
|
- page.p_titre = art.b_titre
|
|
|
|
|
- page.p_contenu = art.b_description
|
|
|
|
|
- page.p_description = strip_tags(art.b_description)
|
|
|
|
|
- if art.b_right != "":
|
|
|
|
|
- page.p_right = art.b_right
|
|
|
|
|
- else:
|
|
|
|
|
- page.p_right = " "
|
|
|
|
|
-
|
|
|
|
|
- page.p_mots_clefs = ""
|
|
|
|
|
- for cat in art.b_cat.all():
|
|
|
|
|
- page.p_mots_clefs = page.p_mots_clefs + cat.cb_titre + ', '
|
|
|
|
|
-
|
|
|
|
|
- art.b_reading = art.b_reading + 1
|
|
|
|
|
- art.save()
|
|
|
|
|
-
|
|
|
|
|
- print(page)
|
|
|
|
|
-
|
|
|
|
|
- html = template.render({
|
|
|
|
|
- 'page': page,
|
|
|
|
|
- 'user': request.user,
|
|
|
|
|
- }, request)
|
|
|
|
|
-
|
|
|
|
|
- return HttpResponse(html)
|
|
|
|
|
|
|
|
|
|
def blog_update(request):
|
|
def blog_update(request):
|
|
|
- arts = Blog.objects.all()
|
|
|
|
|
- for art in arts:
|
|
|
|
|
- print(art.b_titre_slugify)
|
|
|
|
|
- art.b_contenu = art.b_contenu.replace('é"','é').replace('à"','à').replace('ê"','ê').replace('è"','è').replace('ô"', 'ô').replace('«"', '«').replace('»"', '»')
|
|
|
|
|
- #art.b_contenu = art.b_contenu.replace('rsquo','|||').replace('|||','').replace('"',"'").replace("''","'")
|
|
|
|
|
- art.save()
|
|
|
|
|
- return HttpResponse("OK")
|
|
|
|
|
|
|
+ """
|
|
|
|
|
+ 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")
|