""" Interface d'administration pour les modèles Analytics. """ from django.contrib import admin from django.utils.html import format_html from django.urls import reverse from django.utils.translation import gettext_lazy as _ from .models import PageView, UserSession, DailyPageViewSummary @admin.register(PageView) class PageViewAdmin(admin.ModelAdmin): """Interface d'administration pour les vues de pages.""" list_display = [ 'timestamp', 'user_link', 'path', 'method', 'response_time_colored', 'ip_address' ] list_filter = [ 'method', 'timestamp', ('user', admin.RelatedOnlyFieldListFilter), ] search_fields = ['path', 'user__username', 'ip_address', 'full_url'] readonly_fields = [ 'user', 'session_key', 'path', 'full_url', 'method', 'timestamp', 'ip_address', 'user_agent', 'referer', 'response_time_ms' ] date_hierarchy = 'timestamp' ordering = ['-timestamp'] # Pagination list_per_page = 50 def user_link(self, obj): """Lien vers la page de l'utilisateur.""" if obj.user: url = reverse('admin:auth_user_change', args=[obj.user.id]) return format_html('{}', url, obj.user.username) return _("Anonyme") user_link.short_description = _("Utilisateur") def response_time_colored(self, obj): """Affiche le temps de réponse avec une couleur selon la performance.""" if obj.response_time_ms is None: return '-' # Définir les seuils de couleur if obj.response_time_ms < 100: color = 'green' elif obj.response_time_ms < 500: color = 'orange' else: color = 'red' return format_html( '{} ms', color, obj.response_time_ms ) response_time_colored.short_description = _("Temps de réponse") response_time_colored.admin_order_field = 'response_time_ms' def has_add_permission(self, request): """Désactiver l'ajout manuel.""" return False def has_change_permission(self, request, obj=None): """Désactiver la modification.""" return False @admin.register(UserSession) class UserSessionAdmin(admin.ModelAdmin): """Interface d'administration pour les sessions utilisateurs.""" list_display = [ 'login_time', 'user_link', 'duration_formatted', 'page_views_count', 'status_colored', 'ip_address' ] list_filter = [ 'is_active', 'login_time', ('user', admin.RelatedOnlyFieldListFilter), ] search_fields = ['user__username', 'session_key', 'ip_address'] readonly_fields = [ 'user', 'session_key', 'login_time', 'last_activity', 'logout_time', 'ip_address', 'user_agent', 'page_views_count', 'is_active', 'duration_formatted' ] date_hierarchy = 'login_time' ordering = ['-login_time'] # Pagination list_per_page = 50 def user_link(self, obj): """Lien vers la page de l'utilisateur.""" url = reverse('admin:auth_user_change', args=[obj.user.id]) return format_html('{}', url, obj.user.username) user_link.short_description = _("Utilisateur") def status_colored(self, obj): """Affiche le statut avec une couleur.""" if obj.is_active: return format_html( '● {}', _("Active") ) else: return format_html( '○ {}', _("Terminée") ) status_colored.short_description = _("Statut") status_colored.admin_order_field = 'is_active' def duration_formatted(self, obj): """Affiche la durée de la session formatée.""" seconds = obj.duration_seconds if seconds < 60: return f"{int(seconds)}s" elif seconds < 3600: minutes = int(seconds / 60) return f"{minutes}min" else: hours = int(seconds / 3600) minutes = int((seconds % 3600) / 60) return f"{hours}h {minutes}min" duration_formatted.short_description = _("Durée") def has_add_permission(self, request): """Désactiver l'ajout manuel.""" return False def has_change_permission(self, request, obj=None): """Désactiver la modification.""" return False @admin.register(DailyPageViewSummary) class DailyPageViewSummaryAdmin(admin.ModelAdmin): """Interface d'administration pour les résumés quotidiens.""" list_display = [ 'date', 'total_page_views', 'unique_users', 'unique_sessions', 'total_sessions_started', 'avg_response_colored', ] list_filter = ['date'] search_fields = ['date'] readonly_fields = [ 'date', 'total_page_views', 'unique_users', 'unique_sessions', 'unique_ips', 'avg_response_time_ms', 'max_response_time_ms', 'top_paths', 'top_users', 'method_counts', 'total_sessions_started', 'created_at', 'updated_at', ] date_hierarchy = 'date' ordering = ['-date'] list_per_page = 50 def avg_response_colored(self, obj): """Affiche le temps de réponse moyen avec couleur.""" if obj.avg_response_time_ms is None: return '-' val = obj.avg_response_time_ms if val < 100: color = 'green' elif val < 500: color = 'orange' else: color = 'red' return format_html( '{} ms', color, f'{val:.0f}', ) avg_response_colored.short_description = _("Temps de rép. moyen") avg_response_colored.admin_order_field = 'avg_response_time_ms' def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): return False