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 from datetime import timedelta
import os import os
import json import json
import re
from jinja2 import ChoiceLoader, FileSystemLoader, PrefixLoader from jinja2 import ChoiceLoader, FileSystemLoader, PrefixLoader
# Extensions (définies dans extensions.py) # 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["from_json"] = lambda value: json.loads(value) if value else []
app.jinja_env.filters["hex_color"] = bootstrap_color_to_hex app.jinja_env.filters["hex_color"] = bootstrap_color_to_hex
app.jinja_env.filters["text_color"] = bootstrap_text_color 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 app.jinja_env.globals["timedelta"] = timedelta
# Gestionnaires d'erreurs personnalisées # Gestionnaires d'erreurs personnalisées

View file

@ -490,6 +490,27 @@ def template_debug_preview():
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
return '' 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): class DemoField(DemoValue):
@property @property
def label(self): def label(self):
@ -511,47 +532,118 @@ def template_debug_preview():
return DemoField(name.replace('_', ' ').capitalize()) return DemoField(name.replace('_', ' ').capitalize())
class DemoCollection(list): class DemoCollection(list):
def all(self):
return self
def count(self): def count(self):
return len(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_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( demo_equipment = DemoObject(
id=42, name='Luminaire LED central', code='ECL-0042', id=42, name='Luminaire LED central', code='ECL-0042',
full_path='Bâtiment principal / Zone Anglais / B102 / Éclairage', full_path='Bâtiment principal / Zone Anglais / B102 / Éclairage',
room=demo_room, status='en_service', status_label='En service', 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_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_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_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({ preview_context.update({
'current_user': demo_user, 'current_user': demo_user,
'stats': DemoObject(alerts_unread=3, interventions_pending=4, equipments=128), 'stats': DemoObject(alerts_unread=3, interventions_pending=4, equipments=128),
'unread': 3, 'unread': 3,
'alerts': [DemoObject(id=1, title='Luminaire défaillant', message='Une intervention est à traiter.', level='warning')], '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), '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')], 'rooms': DemoCollection([demo_room, DemoObject(id=13, name='B103', code='B103', full_name='Bâtiment principal — Zone Anglais — B103', equipments=DemoCollection())]),
'equipments': [demo_equipment, DemoObject(id=43, name='Prise murale fond de salle', code='ELEC-0043', room=demo_room)], 'equipments': DemoCollection([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')], 'categories': DemoCollection([demo_category, DemoObject(id=2, name='Prises', equipments=DemoCollection())]),
'buildings': [DemoObject(id=1, name='Bâtiment principal')], 'buildings': DemoCollection([demo_building]),
'zones': [DemoObject(id=1, name='Zone Anglais')], 'zones': DemoCollection([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.')], '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': [DemoObject(subject='Maintenance urgente', sender='service@exemple.fr', received_at='21/08/2026 08:15')], 'mails': DemoCollection([demo_mail]),
'tasks': [DemoObject(id=7, name='Contrôle mensuel des luminaires', periodicity='Mensuelle', duration_minutes=30)], 'mail': demo_mail,
'lots': [DemoObject(id=3, name='Éclairage intérieur', category=DemoObject(name='Éclairage'))], 'account': DemoObject(id=1, email='demo@example.fr'),
'companies': [DemoObject(id=2, name='Entreprise Démo Maintenance')], '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(), 'form': DemoForm(),
'manual_form': DemoForm(), 'manual_form': DemoForm(),
'statuses': {'en_service': 'En service', 'en_panne': 'En panne', 'a_jeter': 'À jeter'}, 'statuses': {'en_service': 'En service', 'en_panne': 'En panne', 'a_jeter': 'À jeter'},
'equipment': demo_equipment, 'equipment': demo_equipment,
'meter': demo_meter, 'meter': demo_meter,
'readings': [DemoObject(date=None, value=1250, comment='Relevé de démonstration', user=demo_user)], 'readings': DemoCollection([DemoObject(date=None, value=1250, comment='Relevé de démonstration', user=demo_user)]),
'parts': [DemoObject(id=4, name='Cartouche noire', reference='DEMO-001')], '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), '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, '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) rendered = template.render(**preview_context)
except (TemplateNotFound, Exception) as exc: except (TemplateNotFound, Exception) as exc:
render_error = f'{type(exc).__name__}: {exc}' render_error = f'{type(exc).__name__}: {exc}'