From c5760e4aea76f733ee6205030656fcd9a0189ef3 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 21 Aug 2026 12:49:32 +0000 Subject: [PATCH] =?UTF-8?q?R=C3=A9parer=20les=20aper=C3=A7us=20des=20templ?= =?UTF-8?q?ates=20divergents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_new/__init__.py | 2 + app_new/core/routes/admin.py | 122 ++++++++++++++++++++++++++++++----- 2 files changed, 109 insertions(+), 15 deletions(-) diff --git a/app_new/__init__.py b/app_new/__init__.py index f53b019..421aa21 100644 --- a/app_new/__init__.py +++ b/app_new/__init__.py @@ -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 diff --git a/app_new/core/routes/admin.py b/app_new/core/routes/admin.py index adfb664..5ddc6c1 100644 --- a/app_new/core/routes/admin.py +++ b/app_new/core/routes/admin.py @@ -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}'