Réparer les aperçus des templates divergents
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run

This commit is contained in:
root 2026-08-21 12:49:32 +00:00
parent 799b1ee8ca
commit c5760e4aea
2 changed files with 109 additions and 15 deletions

View file

@ -10,6 +10,7 @@ from flask_wtf.csrf import CSRFProtect
from datetime import timedelta
import os
import json
import re
from jinja2 import ChoiceLoader, FileSystemLoader, PrefixLoader
# Extensions (définies dans extensions.py)
@ -231,6 +232,7 @@ def create_app(config_name='default'):
app.jinja_env.filters["from_json"] = lambda value: json.loads(value) if value else []
app.jinja_env.filters["hex_color"] = bootstrap_color_to_hex
app.jinja_env.filters["text_color"] = bootstrap_text_color
app.jinja_env.filters["slugify"] = lambda value: re.sub(r'[^a-z0-9]+', '-', str(value or '').lower()).strip('-')
app.jinja_env.globals["timedelta"] = timedelta
# Gestionnaires d'erreurs personnalisées

View file

@ -490,6 +490,27 @@ def template_debug_preview():
def __call__(self, *args, **kwargs):
return ''
def __getattr__(self, name):
return self
def __int__(self):
return 0
def __float__(self):
return 0.0
def __gt__(self, other):
return False
def __ge__(self, other):
return False
def __lt__(self, other):
return True
def __le__(self, other):
return True
class DemoField(DemoValue):
@property
def label(self):
@ -511,47 +532,118 @@ def template_debug_preview():
return DemoField(name.replace('_', ' ').capitalize())
class DemoCollection(list):
def all(self):
return self
def count(self):
return len(self)
demo_room = DemoObject(id=12, name='B102', code='B102', full_name='Bâtiment principal — Zone Anglais — B102')
@property
def pages(self):
return 1
@property
def page(self):
return 1
@property
def total(self):
return len(self)
@property
def has_next(self):
return False
@property
def has_prev(self):
return False
def iter_pages(self, *args, **kwargs):
return [1]
class DemoMapping(dict):
def get(self, key, default=None):
return super().get(key, default)
from datetime import date, datetime
demo_date = date(2026, 8, 21)
demo_datetime = datetime(2026, 8, 21, 8, 15)
demo_room = DemoObject(id=12, name='B102', code='B102', full_name='Bâtiment principal — Zone Anglais — B102', equipments=DemoCollection(), rooms=DemoCollection())
demo_user = DemoObject(id=1, username='demo.admin', full_name='Administrateur démo', role='admin', role_label='Administrateur système', is_authenticated=True, is_admin=lambda: True)
demo_equipment = DemoObject(
id=42, name='Luminaire LED central', code='ECL-0042',
full_path='Bâtiment principal / Zone Anglais / B102 / Éclairage',
room=demo_room, status='en_service', status_label='En service',
quantity=1, children=DemoCollection(), documents=DemoCollection(),
)
demo_room.equipments.append(demo_equipment)
demo_meter = DemoObject(id=5, name='Compteur pages', unit='pages', equipment=demo_equipment, equipment_id=demo_equipment.id)
demo_child = DemoObject(id=43, individual_number=1, code='CH-0043', position='Rangée centrale', status='en_service', has_active_curative=False, interventions=DemoCollection())
demo_staff = DemoObject(id=8, full_name='Alex Martin', first_name='Alex', last_name='Martin', function='Agent polyvalent', department='Maintenance', email='alex.martin@example.fr', phone='01 60 00 00 00', is_active=True, intervention_count=12, open_intervention_count=2)
demo_company = DemoObject(id=2, name='Entreprise Démo Maintenance', contact_name='Camille Démo', contact_email='contact@example.fr', contact_phone='01 60 00 00 01', address='1 rue des Ateliers')
demo_lot = DemoObject(id=3, name='Éclairage intérieur', description='Maintenance des luminaires', category=DemoObject(name='Éclairage'), tasks=DemoCollection(), categories=DemoCollection())
demo_part = DemoObject(id=4, name='Cartouche noire', reference='DEMO-001', quantity=12, stock_quantity=12, minimum_stock=2)
demo_training = DemoObject(id=6, title='Habilitation électrique', name='Habilitation électrique', start_date=demo_date, end_date=demo_date, status='planifiee')
demo_building = DemoObject(id=1, name='Bâtiment principal', rooms=DemoCollection([demo_room]))
demo_category = DemoObject(id=1, name='Éclairage', equipments=DemoCollection([demo_equipment]))
demo_mail = DemoObject(id='demo-mail', account_id=1, subject='Maintenance urgente', sender='service@exemple.fr', sender_email='service@exemple.fr', received_at=demo_datetime, is_read=False, importance='normal', has_attachments=False, attachment_count=0, body_content='Message de démonstration.', body_preview='Demande de maintenance fictive.', message_id='demo-mail')
preview_context.update({
'current_user': demo_user,
'stats': DemoObject(alerts_unread=3, interventions_pending=4, equipments=128),
'unread': 3,
'alerts': [DemoObject(id=1, title='Luminaire défaillant', message='Une intervention est à traiter.', level='warning')],
'interventions': [DemoObject(id=39, title='Remplacement du luminaire', status='en_cours', status_label='En cours', room=demo_room, equipment=demo_equipment)],
'interventions': DemoCollection([DemoObject(id=39, title='Remplacement du luminaire', status='en_cours', status_label='En cours', room=demo_room, equipment=demo_equipment)]),
'intervention': DemoObject(id=39, title='Remplacement du luminaire', type='curatif', status='en_cours', status_label='En cours', room=demo_room, equipment=demo_equipment),
'rooms': [demo_room, DemoObject(id=13, name='B103', code='B103', full_name='Bâtiment principal — Zone Anglais — B103')],
'equipments': [demo_equipment, DemoObject(id=43, name='Prise murale fond de salle', code='ELEC-0043', room=demo_room)],
'categories': [DemoObject(id=1, name='Éclairage'), DemoObject(id=2, name='Prises')],
'buildings': [DemoObject(id=1, name='Bâtiment principal')],
'zones': [DemoObject(id=1, name='Zone Anglais')],
'messages': [DemoObject(subject='Demande de réparation', sender='Vie scolaire', body_preview='Une chaise est cassée en B102.')],
'mails': [DemoObject(subject='Maintenance urgente', sender='service@exemple.fr', received_at='21/08/2026 08:15')],
'tasks': [DemoObject(id=7, name='Contrôle mensuel des luminaires', periodicity='Mensuelle', duration_minutes=30)],
'lots': [DemoObject(id=3, name='Éclairage intérieur', category=DemoObject(name='Éclairage'))],
'companies': [DemoObject(id=2, name='Entreprise Démo Maintenance')],
'rooms': DemoCollection([demo_room, DemoObject(id=13, name='B103', code='B103', full_name='Bâtiment principal — Zone Anglais — B103', equipments=DemoCollection())]),
'equipments': DemoCollection([demo_equipment, DemoObject(id=43, name='Prise murale fond de salle', code='ELEC-0043', room=demo_room)]),
'categories': DemoCollection([demo_category, DemoObject(id=2, name='Prises', equipments=DemoCollection())]),
'buildings': DemoCollection([demo_building]),
'zones': DemoCollection([DemoObject(id=1, name='Zone Anglais')]),
'messages': DemoCollection([DemoObject(id=1, subject='Demande de réparation', sender='Vie scolaire', sender_name='Vie scolaire', body_preview='Une chaise est cassée en B102.', is_unread=True, date=None)]),
'mails': DemoCollection([demo_mail]),
'mail': demo_mail,
'account': DemoObject(id=1, email='demo@example.fr'),
'tasks': DemoCollection([DemoObject(id=7, name='Contrôle mensuel des luminaires', periodicity='Mensuelle', duration_minutes=30)]),
'lots': DemoCollection([demo_lot]),
'companies': DemoCollection([demo_company]),
'form': DemoForm(),
'manual_form': DemoForm(),
'statuses': {'en_service': 'En service', 'en_panne': 'En panne', 'a_jeter': 'À jeter'},
'equipment': demo_equipment,
'meter': demo_meter,
'readings': [DemoObject(date=None, value=1250, comment='Relevé de démonstration', user=demo_user)],
'parts': [DemoObject(id=4, name='Cartouche noire', reference='DEMO-001')],
'readings': DemoCollection([DemoObject(date=None, value=1250, comment='Relevé de démonstration', user=demo_user)]),
'parts': DemoCollection([demo_part]),
'group': DemoObject(id=50, name='Chaises salle B102', full_path=demo_room.full_name, children_count=10, total_children=12, tracked_individually=True),
'children': [demo_child],
'children': DemoCollection([demo_child]),
'staff': demo_staff,
'company': demo_company,
'lot': demo_lot,
'part': demo_part,
'training': demo_training,
'trainings': DemoCollection([demo_training]),
'status_counts': {'brouillon': 1, 'en_cours': 2, 'terminee': 4},
'priorities': {'basse': 'Basse', 'normale': 'Normale', 'haute': 'Haute'},
'trashed_count': 1,
'workflow_types': {'corrective': 'Correctif', 'preventive': 'Préventif', 'travaux': 'Travaux'},
'week_start': demo_date,
'week_end': demo_date,
'prev_week': demo_date,
'next_week': demo_date,
'today': demo_date,
'prev_period': demo_date,
'next_period': demo_date,
'days': {0: 'Lundi', 1: 'Mardi', 2: 'Mercredi', 3: 'Jeudi', 4: 'Vendredi'},
'day_date': demo_date,
'schedules': DemoMapping(),
'participant_users': DemoMapping({demo_user.id: True}),
})
from flask import url_for as flask_url_for
def preview_url_for(endpoint, *args, **kwargs):
try:
return flask_url_for(endpoint, *args, **kwargs)
except Exception:
return '#preview'
preview_context['url_for'] = preview_url_for
rendered = template.render(**preview_context)
except (TemplateNotFound, Exception) as exc:
render_error = f'{type(exc).__name__}: {exc}'