79 lines
3.3 KiB
Python
79 lines
3.3 KiB
Python
from django.contrib import admin
|
|
from django.utils.html import format_html
|
|
from django.utils.safestring import mark_safe
|
|
from .models import HomeWidget, HomeWidgetConditionGroup, HomeWidgetCondition
|
|
|
|
|
|
class HomeWidgetConditionInline(admin.TabularInline):
|
|
"""Inline pour les conditions dans un groupe."""
|
|
model = HomeWidgetCondition
|
|
extra = 0
|
|
fields = ('condition_type', 'is_negated', 'role', 'team', 'contract', 'thematic', 'is_intern', 'is_active')
|
|
autocomplete_fields = ('role', 'team', 'contract', 'thematic')
|
|
|
|
|
|
@admin.register(HomeWidgetConditionGroup)
|
|
class HomeWidgetConditionGroupAdmin(admin.ModelAdmin):
|
|
"""Admin pour les groupes de conditions."""
|
|
list_display = ('widget', 'label', 'order', 'priority', 'conditions_summary', 'is_active')
|
|
list_editable = ('order', 'priority', 'is_active')
|
|
list_filter = ('widget', 'is_active')
|
|
search_fields = ('label',)
|
|
inlines = [HomeWidgetConditionInline]
|
|
|
|
def conditions_summary(self, obj):
|
|
"""Affiche le résumé des conditions."""
|
|
summary = obj.get_summary()
|
|
return format_html('<code>{}</code>', summary)
|
|
conditions_summary.short_description = 'Conditions'
|
|
|
|
|
|
class HomeWidgetConditionGroupInline(admin.StackedInline):
|
|
"""Inline pour les groupes de conditions dans un widget."""
|
|
model = HomeWidgetConditionGroup
|
|
extra = 0
|
|
fields = ('label', 'order', 'priority', 'template_override', 'is_active', 'conditions_summary_display')
|
|
readonly_fields = ('conditions_summary_display',)
|
|
show_change_link = True
|
|
|
|
def conditions_summary_display(self, obj):
|
|
"""Affiche le résumé des conditions si le groupe existe."""
|
|
if obj.pk:
|
|
return format_html('<code>{}</code>', obj.get_summary())
|
|
return "-"
|
|
conditions_summary_display.short_description = 'Conditions'
|
|
|
|
|
|
@admin.register(HomeWidget)
|
|
class HomeWidgetAdmin(admin.ModelAdmin):
|
|
"""Admin pour les widgets."""
|
|
list_display = ('widget_code', 'is_active', 'conditions_overview')
|
|
list_editable = ('is_active',)
|
|
list_filter = ('is_active',)
|
|
search_fields = ('widget_code',)
|
|
inlines = [HomeWidgetConditionGroupInline]
|
|
|
|
def conditions_overview(self, obj):
|
|
"""Affiche la synthèse complète des groupes de conditions."""
|
|
groups = obj.condition_groups.filter(is_active=True).order_by('priority')
|
|
|
|
if not groups.exists():
|
|
return format_html(
|
|
'<span style="color: #999; font-style: italic;">Aucun groupe — visible pour tous</span>'
|
|
)
|
|
|
|
parts = []
|
|
for group in groups:
|
|
label_html = f'<strong>{group.label}</strong>: ' if group.label else ''
|
|
conditions = format_html('<code>{}</code>', group.get_summary())
|
|
order_badge = format_html(
|
|
'<span style="background: #E3F2FD; color: #1976D2; padding: 2px 6px; '
|
|
'border-radius: 3px; font-size: 11px; font-weight: bold;">ordre {}</span>',
|
|
group.order
|
|
)
|
|
parts.append(f'({label_html}{conditions} {order_badge})')
|
|
|
|
separator = mark_safe(' <span style="color: #D32F2F; font-weight: bold;">OU</span> ')
|
|
return mark_safe(separator.join(parts))
|
|
|
|
conditions_overview.short_description = 'Configuration'
|