from django.utils.translation import gettext as _ from .models import AdminAuditLog def display_user_name(user) -> str: first_name = (getattr(user, 'first_name', '') or '').strip() last_name = (getattr(user, 'last_name', '') or '').strip() full_name = f'{first_name} {last_name}'.strip() if full_name: return full_name username = (getattr(user, 'username', '') or '').strip() if username: return username return (getattr(user, 'email', '') or '').strip() def audit( request, action: str, *, target_type: str = '', target_id: int | None = None, target_label: str = '', details: dict | None = None, ) -> None: if not getattr(request, 'user', None) or not request.user.is_authenticated: return AdminAuditLog.objects.create( actor=request.user, actor_display=display_user_name(request.user), action=action, target_type=target_type, target_id=target_id, target_label=target_label, details=details or {}, ) def audit_action_label(action: str) -> str: labels = { 'requests_deleted': _('Vorgänge gelöscht'), 'request_deleted': _('Vorgang gelöscht'), 'request_retried': _('Vorgang erneut angestoßen'), 'intro_pdf_generated': _('Einweisungs-PDF erzeugt'), 'intro_live_pdf_generated': _('Live-Protokoll erzeugt'), 'intro_session_reset': _('Einweisung zurückgesetzt'), 'intro_session_saved': _('Einweisung als Entwurf gespeichert'), 'intro_session_completed': _('Einweisung abgeschlossen'), 'form_option_deleted': _('Formularoption gelöscht'), 'form_options_saved': _('Formularoptionen gespeichert'), 'form_field_texts_saved': _('Feldtexte gespeichert'), 'form_layout_saved': _('Formularlayout gespeichert'), 'intro_checklist_item_deleted': _('Einweisungs-Checkpunkt gelöscht'), 'intro_checklist_item_added': _('Einweisungs-Checkpunkt hinzugefügt'), 'intro_checklist_saved': _('Einweisungs-Checkliste gespeichert'), 'welcome_email_triggered_now': _('Welcome E-Mail sofort ausgelöst'), 'welcome_email_settings_saved': _('Welcome E-Mail Einstellungen gespeichert'), 'welcome_email_bulk_action': _('Welcome E-Mail Sammelaktion ausgeführt'), 'welcome_email_paused': _('Welcome E-Mail pausiert'), 'welcome_email_resumed': _('Welcome E-Mail fortgesetzt'), 'welcome_email_cancelled': _('Welcome E-Mail abgebrochen'), 'smtp_test_sent': _('SMTP-Test gesendet'), 'nextcloud_test_upload': _('Nextcloud-Testupload ausgeführt'), 'nextcloud_mode_toggled': _('Nextcloud-Modus umgeschaltet'), 'email_mode_toggled': _('E-Mail-Modus umgeschaltet'), 'integrations_saved': _('Integrationen gespeichert'), 'nextcloud_settings_saved': _('Nextcloud-Einstellungen gespeichert'), 'mail_settings_saved': _('Mail-Einstellungen gespeichert'), 'email_routing_saved': _('E-Mail-Routing gespeichert'), 'notification_rules_saved': _('Benachrichtigungsregeln gespeichert'), 'user_created': _('Benutzer erstellt'), 'user_updated': _('Benutzer aktualisiert'), 'user_password_reset_sent': _('Passwort-Reset-Link versendet'), 'user_deleted': _('Benutzer gelöscht'), 'backup_created': _('Backup erstellt'), 'backup_verified': _('Backup verifiziert'), 'backup_deleted': _('Backup gelöscht'), 'backup_settings_saved': _('Backup-Einstellungen gespeichert'), 'portal_app_registry_saved': _('App-Registry gespeichert'), } return labels.get(action, action.replace('_', ' ').strip().capitalize())