- Add django-otp and qrcode dependencies - Create comprehensive 2FA views and templates in German - Add 2FA setup, verification, and management interfaces - Implement backup token system with 10 recovery codes - Add TwoFactorMiddleware for session enforcement - Integrate 2FA controls into user navigation menu - Support QR code generation for authenticator apps - Add forms for secure 2FA operations with validation - Configure OTP settings and admin site integration Features: - Optional 2FA (users can enable/disable) - TOTP compatible with Google Authenticator, Authy, etc. - Backup codes for emergency access - German language interface - Session-based 2FA enforcement - Password confirmation for sensitive operations - Production-ready with HTTPS support
389 lines
14 KiB
Python
389 lines
14 KiB
Python
from django.urls import path
|
|
|
|
from . import views
|
|
|
|
app_name = "stiftung"
|
|
|
|
urlpatterns = [
|
|
# Dashboard (Startseite)
|
|
path("", views.dashboard, name="dashboard"),
|
|
# Home (für Kompatibilität mit bestehenden Templates)
|
|
path("home/", views.home, name="home"),
|
|
# CSV Import URLs
|
|
path("import/", views.csv_import_list, name="csv_import_list"),
|
|
path("import/neu/", views.csv_import_create, name="csv_import_create"),
|
|
# Destinatär URLs (Förderungsempfänger)
|
|
path("destinataere/", views.destinataer_list, name="destinataer_list"),
|
|
path(
|
|
"destinataere/<uuid:pk>/", views.destinataer_detail, name="destinataer_detail"
|
|
),
|
|
path("destinataere/neu/", views.destinataer_create, name="destinataer_create"),
|
|
path(
|
|
"destinataere/<uuid:pk>/bearbeiten/",
|
|
views.destinataer_update,
|
|
name="destinataer_update",
|
|
),
|
|
path(
|
|
"destinataere/<uuid:pk>/loeschen/",
|
|
views.destinataer_delete,
|
|
name="destinataer_delete",
|
|
),
|
|
path(
|
|
"destinataere/<uuid:pk>/notiz/",
|
|
views.destinataer_notiz_create,
|
|
name="destinataer_notiz_create",
|
|
),
|
|
path(
|
|
"destinataere/<uuid:pk>/export/",
|
|
views.destinataer_export,
|
|
name="destinataer_export",
|
|
),
|
|
# Paechter URLs (Landpächter)
|
|
path("paechter/", views.paechter_list, name="paechter_list"),
|
|
path("paechter/<uuid:pk>/", views.paechter_detail, name="paechter_detail"),
|
|
path("paechter/neu/", views.paechter_create, name="paechter_create"),
|
|
path(
|
|
"paechter/<uuid:pk>/bearbeiten/", views.paechter_update, name="paechter_update"
|
|
),
|
|
path("paechter/<uuid:pk>/loeschen/", views.paechter_delete, name="paechter_delete"),
|
|
path("paechter/<uuid:pk>/export/", views.paechter_export, name="paechter_export"),
|
|
# Legacy Person URLs removed (Destinatäre ersetzen Personen)
|
|
# Land URLs
|
|
path("laendereien/", views.land_list, name="land_list"),
|
|
path("laendereien/<uuid:pk>/", views.land_detail, name="land_detail"),
|
|
path("laendereien/neu/", views.land_create, name="land_create"),
|
|
path("laendereien/<uuid:pk>/bearbeiten/", views.land_update, name="land_update"),
|
|
path("laendereien/<uuid:pk>/loeschen/", views.land_delete, name="land_delete"),
|
|
path("laendereien/<uuid:pk>/export/", views.land_export, name="land_export"),
|
|
# Landabrechnung URLs
|
|
path("landabrechnungen/", views.land_abrechnung_list, name="land_abrechnung_list"),
|
|
path(
|
|
"landabrechnungen/<uuid:pk>/",
|
|
views.land_abrechnung_detail,
|
|
name="land_abrechnung_detail",
|
|
),
|
|
path(
|
|
"landabrechnungen/neu/",
|
|
views.land_abrechnung_create,
|
|
name="land_abrechnung_create",
|
|
),
|
|
path(
|
|
"landabrechnungen/<uuid:pk>/bearbeiten/",
|
|
views.land_abrechnung_update,
|
|
name="land_abrechnung_update",
|
|
),
|
|
path(
|
|
"landabrechnungen/<uuid:pk>/loeschen/",
|
|
views.land_abrechnung_delete,
|
|
name="land_abrechnung_delete",
|
|
),
|
|
# Vereinheitlichte Verpachtung URLs (direkt im Land)
|
|
path(
|
|
"laendereien/<uuid:land_pk>/verpachtung/neu/",
|
|
views.land_verpachtung_create,
|
|
name="land_verpachtung_create",
|
|
),
|
|
path(
|
|
"laendereien/<uuid:land_pk>/verpachtung/bearbeiten/",
|
|
views.land_verpachtung_edit,
|
|
name="land_verpachtung_edit",
|
|
),
|
|
path(
|
|
"laendereien/<uuid:land_pk>/verpachtung/beenden/",
|
|
views.land_verpachtung_end,
|
|
name="land_verpachtung_end",
|
|
),
|
|
# LandVerpachtung URLs (neue Verpachtungen)
|
|
path(
|
|
"laendereien/verpachtungen/<uuid:pk>/",
|
|
views.land_verpachtung_detail,
|
|
name="land_verpachtung_detail",
|
|
),
|
|
path(
|
|
"laendereien/verpachtungen/<uuid:pk>/bearbeiten/",
|
|
views.land_verpachtung_update,
|
|
name="land_verpachtung_update",
|
|
),
|
|
path(
|
|
"laendereien/verpachtungen/<uuid:pk>/beenden/",
|
|
views.land_verpachtung_end_direct,
|
|
name="land_verpachtung_end_direct",
|
|
),
|
|
# Verpachtung URLs (Management Overview)
|
|
path("verpachtungen/", views.verpachtung_list, name="verpachtung_list"),
|
|
path("verpachtungen/<uuid:pk>/", views.verpachtung_detail, name="verpachtung_detail"),
|
|
path("verpachtungen/neu/", views.verpachtung_create, name="verpachtung_create"),
|
|
path(
|
|
"verpachtungen/<uuid:pk>/bearbeiten/",
|
|
views.verpachtung_update,
|
|
name="verpachtung_update",
|
|
),
|
|
path(
|
|
"verpachtungen/<uuid:pk>/loeschen/",
|
|
views.verpachtung_delete,
|
|
name="verpachtung_delete",
|
|
),
|
|
# Förderung URLs
|
|
path("foerderungen/", views.foerderung_list, name="foerderung_list"),
|
|
path("foerderungen/<uuid:pk>/", views.foerderung_detail, name="foerderung_detail"),
|
|
path("foerderungen/neu/", views.foerderung_create, name="foerderung_create"),
|
|
path(
|
|
"foerderungen/<uuid:pk>/bearbeiten/",
|
|
views.foerderung_update,
|
|
name="foerderung_update",
|
|
),
|
|
path(
|
|
"foerderungen/<uuid:pk>/loeschen/",
|
|
views.foerderung_delete,
|
|
name="foerderung_delete",
|
|
),
|
|
# Dokumente URLs
|
|
path("dokumente/", views.dokument_list, name="dokument_list"),
|
|
path("dokumente/<uuid:pk>/", views.dokument_detail, name="dokument_detail"),
|
|
path("dokumente/neu/", views.dokument_create, name="dokument_create"),
|
|
path(
|
|
"dokumente/<uuid:pk>/bearbeiten/", views.dokument_update, name="dokument_update"
|
|
),
|
|
path(
|
|
"dokumente/<uuid:pk>/loeschen/", views.dokument_delete, name="dokument_delete"
|
|
),
|
|
# Dokumentenverwaltung (Paperless-Integration, Verwaltung & Verknüpfung)
|
|
path(
|
|
"dokumente/verwaltung/", views.dokument_management, name="dokument_management"
|
|
),
|
|
# Legacy document URLs removed - use dokument_management instead
|
|
# Dokument-Verknüpfung
|
|
path(
|
|
"api/link-document/search/",
|
|
views.link_document_search,
|
|
name="link_document_search",
|
|
),
|
|
path(
|
|
"api/link-document/create/",
|
|
views.link_document_create,
|
|
name="link_document_create",
|
|
),
|
|
path(
|
|
"api/link-document/list/", views.link_document_list, name="link_document_list"
|
|
),
|
|
path(
|
|
"api/link-document/update/",
|
|
views.link_document_update,
|
|
name="link_document_update",
|
|
),
|
|
path(
|
|
"api/link-document/delete/<uuid:link_id>/",
|
|
views.link_document_delete,
|
|
name="link_document_delete",
|
|
),
|
|
# Legacy dokument_verknuepfung URL removed - use dokument_management instead
|
|
# Jahresbericht URLs
|
|
path("berichte/", views.bericht_list, name="bericht_list"),
|
|
path(
|
|
"berichte/jahresbericht/",
|
|
views.jahresbericht_generate_redirect,
|
|
name="jahresbericht_generate_redirect",
|
|
),
|
|
path(
|
|
"berichte/jahresbericht/<int:jahr>/",
|
|
views.jahresbericht_generate,
|
|
name="jahresbericht_generate",
|
|
),
|
|
path(
|
|
"berichte/jahresbericht/<int:jahr>/pdf/",
|
|
views.jahresbericht_pdf,
|
|
name="jahresbericht_pdf",
|
|
),
|
|
# Geschäftsführung URLs
|
|
path("geschaeftsfuehrung/", views.geschaeftsfuehrung, name="geschaeftsfuehrung"),
|
|
path("geschaeftsfuehrung/konten/", views.konto_list, name="konto_list"),
|
|
path("geschaeftsfuehrung/konten/neu/", views.konto_create, name="konto_create"),
|
|
path(
|
|
"geschaeftsfuehrung/konten/<uuid:pk>/", views.konto_detail, name="konto_detail"
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/konten/<uuid:pk>/bearbeiten/",
|
|
views.konto_edit,
|
|
name="konto_edit",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/verwaltungskosten/",
|
|
views.verwaltungskosten_list,
|
|
name="verwaltungskosten_list",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/verwaltungskosten/neu/",
|
|
views.verwaltungskosten_create,
|
|
name="verwaltungskosten_create",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/verwaltungskosten/<uuid:pk>/bearbeiten/",
|
|
views.verwaltungskosten_edit,
|
|
name="verwaltungskosten_edit",
|
|
),
|
|
path(
|
|
"verwaltungskosten/mark-paid/",
|
|
views.mark_expense_paid,
|
|
name="mark_expense_paid",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/rentmeister/",
|
|
views.rentmeister_list,
|
|
name="rentmeister_list",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/rentmeister/neu/",
|
|
views.rentmeister_create,
|
|
name="rentmeister_create",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/rentmeister/<uuid:pk>/",
|
|
views.rentmeister_detail,
|
|
name="rentmeister_detail",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/rentmeister/<uuid:pk>/bearbeiten/",
|
|
views.rentmeister_edit,
|
|
name="rentmeister_edit",
|
|
),
|
|
path(
|
|
"geschaeftsfuehrung/rentmeister/<uuid:pk>/ausgaben/",
|
|
views.rentmeister_ausgaben,
|
|
name="rentmeister_ausgaben",
|
|
),
|
|
# Administration URLs
|
|
path("administration/", views.administration, name="administration"),
|
|
path("administration/settings/", views.app_settings, name="app_settings"),
|
|
path("administration/audit-log/", views.audit_log_list, name="audit_log_list"),
|
|
path("administration/backup/", views.backup_management, name="backup_management"),
|
|
path(
|
|
"administration/backup/<uuid:backup_id>/download/",
|
|
views.backup_download,
|
|
name="backup_download",
|
|
),
|
|
path("administration/backup/restore/", views.backup_restore, name="backup_restore"),
|
|
path(
|
|
"administration/backup/<uuid:backup_id>/cancel/",
|
|
views.backup_cancel,
|
|
name="backup_cancel",
|
|
),
|
|
path(
|
|
"administration/unterstuetzungen/",
|
|
views.unterstuetzungen_list,
|
|
name="unterstuetzungen_list",
|
|
),
|
|
path(
|
|
"administration/unterstuetzungen/<uuid:pk>/bearbeiten/",
|
|
views.unterstuetzung_edit,
|
|
name="unterstuetzung_edit",
|
|
),
|
|
path(
|
|
"administration/unterstuetzungen/<uuid:pk>/loeschen/",
|
|
views.unterstuetzung_delete,
|
|
name="unterstuetzung_delete",
|
|
),
|
|
# Unterstützungen URLs (direct access from Destinataer)
|
|
path("unterstuetzungen/", views.unterstuetzungen_all, name="unterstuetzungen_all"),
|
|
path(
|
|
"unterstuetzungen/neu/",
|
|
views.unterstuetzung_create,
|
|
name="unterstuetzung_create",
|
|
),
|
|
path(
|
|
"unterstuetzungen/<uuid:pk>/",
|
|
views.unterstuetzung_detail,
|
|
name="unterstuetzung_detail",
|
|
),
|
|
path(
|
|
"unterstuetzungen/<uuid:pk>/bezahlt/",
|
|
views.unterstuetzung_mark_paid,
|
|
name="unterstuetzung_mark_paid",
|
|
),
|
|
path(
|
|
"unterstuetzungen/wiederkehrend/",
|
|
views.wiederkehrende_unterstuetzungen,
|
|
name="wiederkehrende_unterstuetzungen",
|
|
),
|
|
# AJAX endpoints
|
|
path(
|
|
"api/destinataer/<uuid:destinataer_id>/info/",
|
|
views.get_destinataer_info,
|
|
name="get_destinataer_info",
|
|
),
|
|
# Authentication URLs
|
|
path("login/", views.user_login, name="login"),
|
|
path("logout/", views.user_logout, name="logout"),
|
|
# User Management URLs
|
|
path("administration/users/", views.user_management, name="user_management"),
|
|
path("administration/users/create/", views.user_create, name="user_create"),
|
|
path("administration/users/<int:pk>/", views.user_detail, name="user_detail"),
|
|
path("administration/users/<int:pk>/edit/", views.user_edit, name="user_edit"),
|
|
path(
|
|
"administration/users/<int:pk>/password/",
|
|
views.user_change_password,
|
|
name="user_change_password",
|
|
),
|
|
path(
|
|
"administration/users/<int:pk>/permissions/",
|
|
views.user_permissions,
|
|
name="user_permissions",
|
|
),
|
|
path(
|
|
"administration/users/<int:pk>/delete/", views.user_delete, name="user_delete"
|
|
),
|
|
# Two-Factor Authentication URLs
|
|
path("auth/2fa/setup/", views.two_factor_setup, name="two_factor_setup"),
|
|
path("auth/2fa/qr/", views.two_factor_qr, name="two_factor_qr"),
|
|
path("auth/2fa/verify/", views.two_factor_verify, name="two_factor_verify"),
|
|
path("auth/2fa/disable/", views.two_factor_disable, name="two_factor_disable"),
|
|
path("auth/2fa/backup-tokens/", views.backup_tokens, name="backup_tokens"),
|
|
# Hilfsbox URLs
|
|
path("help-box/edit/", views.edit_help_box, name="edit_help_box"),
|
|
path("help-box/admin/", views.edit_help_box, name="help_boxes_admin"),
|
|
# API URLs
|
|
path("api/land-stats/", views.land_stats_api, name="land_stats_api"),
|
|
path("api/health/", views.health_check, name="health_check"),
|
|
path("api/paperless/ping/", views.paperless_ping, name="paperless_ping"),
|
|
path(
|
|
"api/paperless/documents/",
|
|
views.paperless_documents,
|
|
name="paperless_documents",
|
|
),
|
|
path("api/paperless/tags/", views.paperless_tags_only, name="paperless_tags_only"),
|
|
path("api/paperless/debug/", views.paperless_debug, name="paperless_debug"),
|
|
path(
|
|
"api/paperless/documents/<int:doc_id>/",
|
|
views.paperless_document_redirect,
|
|
name="paperless_document_redirect",
|
|
),
|
|
# Gramps integration (probe)
|
|
path("api/gramps/search/", views.gramps_search_api, name="gramps_search_api"),
|
|
path("api/gramps/debug/", views.gramps_debug_api, name="gramps_debug_api"),
|
|
# Quarterly Confirmations
|
|
path(
|
|
"quarterly-confirmations/create/<uuid:destinataer_id>/",
|
|
views.quarterly_confirmation_create,
|
|
name="quarterly_confirmation_create",
|
|
),
|
|
path(
|
|
"quarterly-confirmations/<uuid:pk>/edit/",
|
|
views.quarterly_confirmation_edit,
|
|
name="quarterly_confirmation_edit",
|
|
),
|
|
path(
|
|
"quarterly-confirmations/<uuid:pk>/update/",
|
|
views.quarterly_confirmation_update,
|
|
name="quarterly_confirmation_update",
|
|
),
|
|
path(
|
|
"quarterly-confirmations/<uuid:pk>/approve/",
|
|
views.quarterly_confirmation_approve,
|
|
name="quarterly_confirmation_approve",
|
|
),
|
|
path(
|
|
"quarterly-confirmations/<uuid:pk>/reset/",
|
|
views.quarterly_confirmation_reset,
|
|
name="quarterly_confirmation_reset",
|
|
),
|
|
]
|