loko/streetup/home/admin.py

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 mark_safe(
'<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'