File size: 2,609 Bytes
46e055c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from flask import Blueprint
from flask_admin.contrib.sqla import ModelView
from flask_admin import BaseView, expose
from app import db, admin
from app.models import Matiere, SousCategorie, Texte
from flask_ckeditor import CKEditorField  
from wtforms import StringField, TextAreaField 
from bleach import clean
from bs4 import BeautifulSoup


bp = Blueprint('custom_admin', __name__, url_prefix='/admin')

def sanitize_html(html_content):
    # TRÈS PERMISSIF - UNIQUEMENT POUR LE TEST
    return clean(html_content, tags=[], attributes={}, strip=False)



class MatiereView(ModelView):
    column_list = ('nom', 'sous_categories')  # Colonnes à afficher dans la liste
    form_columns = ('nom',) 

class SousCategorieView(ModelView):
    column_list = ('nom', 'matiere')
    form_columns = ('nom', 'matiere')
    #form_overrides = dict(nom=StringField)
    form_args = {  # Amélioration de la sélection de la matière
        'matiere': {
            'query_factory': lambda: Matiere.query.order_by(func.lower(Matiere.nom)) #Tri insensible à la casse
        }
    }
    def on_model_change(self, form, model, is_created):
        # Vérification de l'unicité (nom, matiere_id) *avant* l'insertion/mise à jour
        if is_created:
          existing = SousCategorie.query.filter(
              func.lower(SousCategorie.nom) == func.lower(form.nom.data),
              SousCategorie.matiere_id == form.matiere.data.id
          ).first()
          if existing:
              raise ValueError("Cette sous-catégorie existe déjà pour cette matière.")
        else: #Mise à jour
            existing = SousCategorie.query.filter(
              func.lower(SousCategorie.nom) == func.lower(form.nom.data),
              SousCategorie.matiere_id == form.matiere.data.id,
              SousCategorie.id != model.id 
          ).first()

            if existing:
              raise ValueError("Cette sous-catégorie existe déjà pour cette matière.")


class TexteView(ModelView):
    column_list = ('titre', 'sous_categorie')
    form_columns = ('titre', 'contenu', 'sous_categorie')
    form_overrides = dict(contenu=CKEditorField)
    form_args = {
      'sous_categorie': {
          'query_factory': lambda: SousCategorie.query.join(Matiere).order_by(func.lower(Matiere.nom), func.lower(SousCategorie.nom))
      }
    }
   
    def on_model_change(self, form, model, is_created):
        model.contenu = sanitize_html(form.contenu.data)



admin.add_view(MatiereView(Matiere, db.session))
admin.add_view(SousCategorieView(SousCategorie, db.session))
admin.add_view(TexteView(Texte, db.session))