Réparer les aperçus des templates divergents
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
This commit is contained in:
parent
799b1ee8ca
commit
c5760e4aea
2 changed files with 109 additions and 15 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
Loading…
Reference in a new issue