Remove obsolete dashboard functionality
- Remove dashboard view from urls.py and views.py - Delete dashboard.html template - Remove dashboard navigation link from base.html - Replace all dashboard redirects with home redirects in views.py - Update all breadcrumb links from 'Dashboard' to 'Home' in templates - Update German text from 'Dashboard' to 'Startseite' in auth templates - Update 'Zurück zum Dashboard' links to 'Zurück zur Startseite' The dashboard was redundant with the home page functionality. All navigation now directs users to the main home page instead. System check passes without issues after removal.
This commit is contained in:
@@ -7,8 +7,6 @@ app_name = "stiftung"
|
||||
urlpatterns = [
|
||||
# Home - Main landing page after login
|
||||
path("", views.home, name="home"),
|
||||
# Dashboard (detailed view)
|
||||
path("dashboard/", views.dashboard, name="dashboard"),
|
||||
# CSV Import URLs
|
||||
path("import/", views.csv_import_list, name="csv_import_list"),
|
||||
path("import/neu/", views.csv_import_create, name="csv_import_create"),
|
||||
|
||||
@@ -2498,145 +2498,6 @@ def jahresbericht_pdf(request, jahr):
|
||||
return response
|
||||
|
||||
|
||||
# Dashboard Views
|
||||
@login_required
|
||||
def dashboard(request):
|
||||
# Foerderung statistics (Person statistics removed - was legacy Verpachtung system)
|
||||
total_foerderungen = Foerderung.objects.aggregate(total=Sum("betrag"))["total"] or 0
|
||||
|
||||
# Land statistics
|
||||
total_land = Land.objects.count()
|
||||
active_land = Land.objects.filter(aktiv=True).count()
|
||||
total_flaeche = Land.objects.aggregate(total=Sum("groesse_qm"))["total"] or 0
|
||||
|
||||
# Calculate total verpachtet from active verpachtungen
|
||||
total_verpachtet = (
|
||||
LandVerpachtung.objects.filter(status="aktiv").aggregate(
|
||||
total=Sum("verpachtete_flaeche")
|
||||
)["total"]
|
||||
or 0
|
||||
)
|
||||
|
||||
# Verpachtung statistics
|
||||
total_verpachtungen = LandVerpachtung.objects.count()
|
||||
active_verpachtungen = LandVerpachtung.objects.filter(status="aktiv").count()
|
||||
total_pachtzins = (
|
||||
LandVerpachtung.objects.filter(status="aktiv").aggregate(
|
||||
total=Sum("pachtzins_pauschal")
|
||||
)["total"]
|
||||
or 0
|
||||
)
|
||||
|
||||
# Recent activities
|
||||
recent_lands = Land.objects.order_by("-erstellt_am")[:5]
|
||||
recent_verpachtungen = LandVerpachtung.objects.select_related(
|
||||
"land", "paechter"
|
||||
).order_by("-erstellt_am")[:5]
|
||||
|
||||
# Dokumentenübersicht
|
||||
dokumente_uebersicht = DokumentLink.objects.all().order_by("-id")[:10]
|
||||
|
||||
# Verfügbare Paperless-Dokumente für Dashboard
|
||||
available_paperless_docs = []
|
||||
from stiftung.utils.config import get_paperless_config
|
||||
|
||||
config = get_paperless_config()
|
||||
url = config["api_url"]
|
||||
token = config["api_token"]
|
||||
|
||||
if url and token:
|
||||
try:
|
||||
base_url = url.rstrip("/api") if url.endswith("/api") else url
|
||||
headers = {"Authorization": f"Token {token}"}
|
||||
|
||||
# Alle verfügbaren Dokumente abrufen (mit Paginierung)
|
||||
all_dokumente = []
|
||||
page = 1
|
||||
page_size = 100
|
||||
|
||||
while True:
|
||||
response = requests.get(
|
||||
f"{base_url}/api/documents/?page={page}&page_size={page_size}",
|
||||
headers=headers,
|
||||
timeout=10,
|
||||
)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
|
||||
all_dokumente.extend(data.get("results", []))
|
||||
|
||||
if not data.get("next"):
|
||||
break
|
||||
page += 1
|
||||
|
||||
# Stiftung-Dokumente filtern
|
||||
for doc in all_dokumente:
|
||||
try:
|
||||
tags = []
|
||||
doc_tags = doc.get("tags", [])
|
||||
|
||||
if isinstance(doc_tags, list):
|
||||
for tag in doc_tags:
|
||||
if isinstance(tag, dict) and "name" in tag:
|
||||
tags.append(tag["name"])
|
||||
elif isinstance(tag, str):
|
||||
tags.append(tag)
|
||||
elif isinstance(tag, int):
|
||||
tags.append(f"Tag_{tag}")
|
||||
elif isinstance(doc_tags, str):
|
||||
tags = [tag.strip() for tag in doc_tags.split(",")]
|
||||
|
||||
if any(
|
||||
tag
|
||||
in [
|
||||
config["destinataere_tag"],
|
||||
config["land_tag"],
|
||||
config["admin_tag"],
|
||||
]
|
||||
for tag in tags
|
||||
):
|
||||
bereits_verknuepft = DokumentLink.objects.filter(
|
||||
paperless_document_id=doc["id"]
|
||||
).exists()
|
||||
|
||||
if not bereits_verknuepft:
|
||||
available_paperless_docs.append(
|
||||
{
|
||||
"id": doc["id"],
|
||||
"title": doc.get("title", f'Dokument {doc["id"]}'),
|
||||
"created_date": doc.get("created_date", ""),
|
||||
"tags": tags,
|
||||
"thumbnail_url": f"{base_url}/api/documents/{doc['id']}/thumb/",
|
||||
"document_url": f"{base_url}/documents/{doc['id']}/",
|
||||
}
|
||||
)
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
# Nach Erstellungsdatum sortieren (neueste zuerst)
|
||||
available_paperless_docs.sort(key=lambda x: x["created_date"], reverse=True)
|
||||
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
context = {
|
||||
# Person statistics removed - was legacy Verpachtung system
|
||||
"total_foerderungen": total_foerderungen,
|
||||
"total_land": total_land,
|
||||
"active_land": active_land,
|
||||
"total_flaeche": total_flaeche,
|
||||
"total_verpachtet": total_verpachtet,
|
||||
"total_verpachtungen": total_verpachtungen,
|
||||
"active_verpachtungen": active_verpachtungen,
|
||||
"total_pachtzins": total_pachtzins,
|
||||
"recent_lands": recent_lands,
|
||||
"recent_verpachtungen": recent_verpachtungen,
|
||||
"dokumente_uebersicht": dokumente_uebersicht,
|
||||
"available_paperless_docs": available_paperless_docs,
|
||||
}
|
||||
return render(request, "stiftung/dashboard.html", context)
|
||||
|
||||
|
||||
# API Views for AJAX
|
||||
@login_required
|
||||
def land_stats_api(request):
|
||||
@@ -6517,7 +6378,7 @@ def user_login(request):
|
||||
from django.contrib.auth.forms import AuthenticationForm
|
||||
|
||||
if request.user.is_authenticated:
|
||||
return redirect("stiftung:dashboard")
|
||||
return redirect("stiftung:home")
|
||||
|
||||
if request.method == "POST":
|
||||
form = AuthenticationForm(request, data=request.POST)
|
||||
@@ -6535,11 +6396,11 @@ def user_login(request):
|
||||
|
||||
messages.success(request, f"Willkommen zurück, {user.username}!")
|
||||
|
||||
# Redirect to safe next URL path or dashboard
|
||||
# Redirect to safe next URL path or home
|
||||
next_param = request.GET.get("next") or request.POST.get("next")
|
||||
if next_param and next_param.startswith("/"):
|
||||
return redirect(next_param)
|
||||
return redirect("stiftung:dashboard")
|
||||
return redirect("stiftung:home")
|
||||
else:
|
||||
messages.error(request, "Ungültige Anmeldedaten.")
|
||||
else:
|
||||
@@ -7248,7 +7109,7 @@ def edit_help_box(request):
|
||||
messages.error(
|
||||
request, "Sie haben keine Berechtigung, Hilfsboxen zu bearbeiten."
|
||||
)
|
||||
return redirect("stiftung:dashboard")
|
||||
return redirect("stiftung:home")
|
||||
|
||||
if request.method == "POST":
|
||||
page_key = request.POST.get("page_key")
|
||||
@@ -7258,7 +7119,7 @@ def edit_help_box(request):
|
||||
|
||||
if not page_key or not title or not content:
|
||||
messages.error(request, "Alle Felder sind erforderlich.")
|
||||
return redirect(request.META.get("HTTP_REFERER", "stiftung:dashboard"))
|
||||
return redirect(request.META.get("HTTP_REFERER", "stiftung:home"))
|
||||
|
||||
# Hilfsbox erstellen oder aktualisieren
|
||||
help_box, created = HelpBox.objects.get_or_create(
|
||||
@@ -7285,7 +7146,7 @@ def edit_help_box(request):
|
||||
messages.success(request, f'Hilfsbox "{title}" wurde erstellt.')
|
||||
|
||||
# Zurück zur vorherigen Seite
|
||||
return redirect(request.META.get("HTTP_REFERER", "stiftung:dashboard"))
|
||||
return redirect(request.META.get("HTTP_REFERER", "stiftung:home"))
|
||||
|
||||
# GET Request - Zeige Admin-Übersicht der Hilfsboxen
|
||||
help_boxes = HelpBox.objects.all().order_by("page_key", "-updated_at")
|
||||
@@ -7955,7 +7816,7 @@ def two_factor_verify(request):
|
||||
if device.verify_token(token):
|
||||
request.session['2fa_verified'] = True
|
||||
messages.success(request, "Zwei-Faktor-Authentifizierung erfolgreich.")
|
||||
return redirect(request.GET.get('next', 'stiftung:dashboard'))
|
||||
return redirect(request.GET.get('next', 'stiftung:home'))
|
||||
|
||||
# Check static backup tokens
|
||||
static_devices = StaticDevice.objects.filter(user=request.user)
|
||||
@@ -7963,7 +7824,7 @@ def two_factor_verify(request):
|
||||
if device.verify_token(token):
|
||||
request.session['2fa_verified'] = True
|
||||
messages.success(request, "Backup-Code erfolgreich verwendet.")
|
||||
return redirect(request.GET.get('next', 'stiftung:dashboard'))
|
||||
return redirect(request.GET.get('next', 'stiftung:home'))
|
||||
|
||||
messages.error(request, "Ungültiger Code. Bitte versuchen Sie es erneut.")
|
||||
|
||||
@@ -7992,7 +7853,7 @@ def two_factor_disable(request):
|
||||
request,
|
||||
"Zwei-Faktor-Authentifizierung wurde erfolgreich deaktiviert."
|
||||
)
|
||||
return redirect("stiftung:dashboard")
|
||||
return redirect("stiftung:home")
|
||||
else:
|
||||
messages.error(request, "Ungültiges Passwort.")
|
||||
|
||||
|
||||
@@ -528,11 +528,6 @@
|
||||
<i class="fas fa-home me-1"></i>Home
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'stiftung:dashboard' %}">
|
||||
<i class="fas fa-tachometer-alt me-1"></i>Dashboard
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<!-- Destinatäre -->
|
||||
<li class="nav-item dropdown">
|
||||
|
||||
@@ -72,9 +72,9 @@
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-4">
|
||||
<a href="{% url 'stiftung:dashboard' %}" class="btn btn-primary btn-lg">
|
||||
<a href="{% url 'stiftung:home' %}" class="btn btn-primary btn-lg">
|
||||
<i class="fas fa-home"></i>
|
||||
Weiter zum Dashboard
|
||||
Weiter zur Startseite
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -133,9 +133,9 @@
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-3">
|
||||
<a href="{% url 'stiftung:dashboard' %}" class="btn btn-outline-secondary">
|
||||
<a href="{% url 'stiftung:home' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left"></i>
|
||||
Zurück zum Dashboard
|
||||
Zurück zur Startseite
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
<i class="fas fa-times-circle"></i>
|
||||
Zwei-Faktor-Authentifizierung deaktivieren
|
||||
</button>
|
||||
<a href="{% url 'stiftung:dashboard' %}" class="btn btn-outline-secondary">
|
||||
<a href="{% url 'stiftung:home' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left"></i>
|
||||
Abbrechen
|
||||
</a>
|
||||
|
||||
@@ -111,9 +111,9 @@
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-3">
|
||||
<a href="{% url 'stiftung:dashboard' %}" class="btn btn-outline-secondary">
|
||||
<a href="{% url 'stiftung:home' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left"></i>
|
||||
Zurück zum Dashboard
|
||||
Zurück zur Startseite
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
<i class="fas fa-check"></i>
|
||||
Zwei-Faktor-Authentifizierung aktivieren
|
||||
</button>
|
||||
<a href="{% url 'stiftung:dashboard' %}" class="btn btn-outline-secondary">
|
||||
<a href="{% url 'stiftung:home' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-times"></i>
|
||||
Abbrechen
|
||||
</a>
|
||||
|
||||
@@ -1,400 +0,0 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Dashboard - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h1 class="h3 mb-4">
|
||||
<i class="fas fa-tachometer-alt text-primary me-2"></i>
|
||||
Dashboard - Stiftungsverwaltung
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Statistics Cards -->
|
||||
<div class="row mb-4">
|
||||
<!-- Land Statistics -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-success shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col mr-2">
|
||||
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">
|
||||
Ländereien
|
||||
</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">
|
||||
{{ total_land }}
|
||||
</div>
|
||||
<div class="text-xs text-muted">
|
||||
{{ total_flaeche|floatformat:0 }} qm Gesamtfläche
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="fas fa-map fa-2x text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Verpachtung Statistics -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-info shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col mr-2">
|
||||
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">
|
||||
Verpachtungen
|
||||
</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">
|
||||
{{ active_verpachtungen }}
|
||||
</div>
|
||||
<div class="text-xs text-muted">
|
||||
{{ total_verpachtet|floatformat:0 }} qm verpachtet
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="fas fa-handshake fa-2x text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Financial Statistics -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-warning shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col mr-2">
|
||||
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
|
||||
Einnahmen
|
||||
</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">
|
||||
€{{ total_pachtzins|floatformat:0 }}
|
||||
</div>
|
||||
<div class="text-xs text-muted">
|
||||
Jährlicher Pachtzins
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="fas fa-euro-sign fa-2x text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Quick Actions -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-bolt me-2"></i>Schnellzugriff
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:foerderung_create' %}" class="btn btn-outline-primary w-100 h-100 d-flex flex-column align-items-center justify-content-center p-3">
|
||||
<i class="fas fa-gift fa-2x mb-2"></i>
|
||||
<span>Neue Förderung</span>
|
||||
</a>
|
||||
</div>
|
||||
<!-- Removed generic "Neue Verpachtung" - now created via specific Land pages -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:bericht_list' %}" class="btn btn-outline-info w-100 h-100 d-flex flex-column align-items-center justify-content-center p-3">
|
||||
<i class="fas fa-chart-bar fa-2x mb-2"></i>
|
||||
<span>Jahresberichte</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:csv_import_create' %}" class="btn btn-outline-warning w-100 h-100 d-flex flex-column align-items-center justify-content-center p-3">
|
||||
<i class="fas fa-upload fa-2x mb-2"></i>
|
||||
<span>CSV Import</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:dokument_management' %}" class="btn btn-outline-info w-100 h-100 d-flex flex-column align-items-center justify-content-center p-3">
|
||||
<i class="fas fa-file-alt fa-2x mb-2"></i>
|
||||
<span>Dokumentenverwaltung</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:dokument_list' %}" class="btn btn-outline-secondary w-100 h-100 d-flex flex-column align-items-center justify-content-center p-3">
|
||||
<i class="fas fa-link fa-2x mb-2"></i>
|
||||
<span>Dokumente</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dokumentenübersicht -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3 d-flex justify-content-between align-items-center">
|
||||
<h6 class="m-0 font-weight-bold text-success">
|
||||
<i class="fas fa-file-alt me-2"></i>Dokumentenübersicht
|
||||
</h6>
|
||||
<a href="{% url 'stiftung:dokument_management' %}" class="btn btn-success btn-sm">
|
||||
<i class="fas fa-external-link-alt me-1"></i>Dokumentenverwaltung
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if dokumente_uebersicht %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Dokument</th>
|
||||
<th>Kontext</th>
|
||||
<th>Verknüpft mit</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for dokument in dokumente_uebersicht %}
|
||||
<tr>
|
||||
<td>
|
||||
<strong>{{ dokument.titel }}</strong>
|
||||
<br>
|
||||
<small class="text-muted">ID: {{ dokument.paperless_document_id }}</small>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-secondary">{{ dokument.get_kontext_display }}</span>
|
||||
</td>
|
||||
<td>
|
||||
{% if dokument.verpachtung_id %}
|
||||
<span class="badge bg-info">Verpachtung</span>
|
||||
{% elif dokument.land_id %}
|
||||
<span class="badge bg-success">Länderei</span>
|
||||
{% elif dokument.paechter_id %}
|
||||
<span class="badge bg-primary">Pächter</span>
|
||||
{% elif dokument.destinataer_id %}
|
||||
<span class="badge bg-warning">Destinatär</span>
|
||||
{% elif dokument.foerderung_id %}
|
||||
<span class="badge bg-secondary">Förderung</span>
|
||||
{% else %}
|
||||
<span class="text-muted">Keine Verknüpfung</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group" role="group">
|
||||
<a href="{{ dokument.get_paperless_url }}" target="_blank" class="btn btn-sm btn-outline-primary" title="In Paperless öffnen">
|
||||
<i class="fas fa-external-link-alt"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:dokument_detail' dokument.pk %}" class="btn btn-sm btn-outline-info" title="Details">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:dokument_update' dokument.pk %}" class="btn btn-sm btn-outline-warning" title="Bearbeiten">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="text-center mt-3">
|
||||
<a href="{% url 'stiftung:dokument_list' %}" class="btn btn-success">
|
||||
Alle Dokumente anzeigen
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center py-4">
|
||||
<i class="fas fa-file-alt fa-3x text-muted mb-3"></i>
|
||||
<h5 class="text-muted">Keine Dokumente verknüpft</h5>
|
||||
<p class="text-muted">Verknüpfen Sie Dokumente aus Paperless mit Ihren Entitäten.</p>
|
||||
<a href="{% url 'stiftung:dokument_management' %}" class="btn btn-success">
|
||||
<i class="fas fa-external-link-alt me-2"></i>Dokumentenverwaltung öffnen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Verfügbare Paperless-Dokumente -->
|
||||
{% if available_paperless_docs %}
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3 d-flex justify-content-between align-items-center">
|
||||
<h6 class="m-0 font-weight-bold text-info">
|
||||
<i class="fas fa-plus-circle me-2"></i>Verfügbare Paperless-Dokumente
|
||||
</h6>
|
||||
<span class="badge bg-info">{{ available_paperless_docs|length }} verfügbar</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
{% for doc in available_paperless_docs|slice:":6" %}
|
||||
<div class="col-md-6 col-lg-4 mb-3">
|
||||
<div class="card h-100 border-info">
|
||||
<div class="card-body">
|
||||
<h6 class="card-title">{{ doc.title }}</h6>
|
||||
<div class="mb-2">
|
||||
{% for tag in doc.tags %}
|
||||
{% if tag == 'Stiftung_Destinatäre' or tag == 'Stiftung_Land_und_Pächter' or tag == 'Stiftung_Administration' %}
|
||||
<span class="badge bg-primary me-1">{{ tag }}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-light text-dark me-1">{{ tag }}</span>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<a href="{{ doc.document_url }}" target="_blank" class="btn btn-sm btn-outline-info">
|
||||
<i class="fas fa-external-link-alt me-1"></i>In Paperless öffnen
|
||||
</a>
|
||||
<a href="{% url 'stiftung:dokument_management' %}" class="btn btn-sm btn-success">
|
||||
<i class="fas fa-link me-1"></i>Verknüpfen
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="text-center mt-3">
|
||||
<a href="{% url 'stiftung:dokument_management' %}" class="btn btn-info">
|
||||
<i class="fas fa-external-link-alt me-2"></i>Alle verfügbaren Dokumente anzeigen
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Recent Activities -->
|
||||
<div class="row">
|
||||
<!-- Recent Lands -->
|
||||
<div class="col-lg-6 mb-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-map me-2"></i>Neueste Ländereien
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if recent_lands %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for land in recent_lands %}
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<h6 class="mb-1">{{ land.gemeinde }} - {{ land.gemarkung }}</h6>
|
||||
<small class="text-muted">
|
||||
Flur {{ land.flur }}, Flurstück {{ land.flurstueck }}
|
||||
({{ land.groesse_qm|floatformat:0 }} qm)
|
||||
</small>
|
||||
</div>
|
||||
<a href="{% url 'stiftung:land_detail' land.pk %}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="text-center mt-3">
|
||||
<a href="{% url 'stiftung:land_list' %}" class="btn btn-sm btn-primary">
|
||||
Alle Ländereien anzeigen
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted text-center">Noch keine Ländereien vorhanden.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Recent Verpachtungen -->
|
||||
<div class="col-lg-6 mb-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-handshake me-2"></i>Neueste Verpachtungen
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if recent_verpachtungen %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for verpachtung in recent_verpachtungen %}
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<h6 class="mb-1">{{ verpachtung.land.gemeinde }}</h6>
|
||||
<small class="text-muted">
|
||||
{{ verpachtung.paechter.get_full_name }} -
|
||||
€{{ verpachtung.pachtzins_jaehrlich|floatformat:0 }}/Jahr
|
||||
</small>
|
||||
</div>
|
||||
<a href="{% url 'stiftung:land_verpachtung_detail' verpachtung.pk %}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="text-center mt-3">
|
||||
<a href="{% url 'stiftung:land_list' %}" class="btn btn-sm btn-primary">
|
||||
Ländereien verwalten
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted text-center">Noch keine Verpachtungen vorhanden.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Financial Overview -->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-chart-pie me-2"></i>Finanzübersicht
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-4 text-center">
|
||||
<div class="border rounded p-3">
|
||||
<h4 class="text-success">€{{ total_pachtzins|floatformat:0 }}</h4>
|
||||
<p class="text-muted mb-0">Jährlicher Pachtzins</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 text-center">
|
||||
<div class="border rounded p-3">
|
||||
<h4 class="text-info">€{{ total_foerderungen|floatformat:0 }}</h4>
|
||||
<p class="text-muted mb-0">Gesamtförderungen</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 text-center">
|
||||
<div class="border rounded p-3">
|
||||
<h4 class="text-warning">{{ total_verpachtet|floatformat:0 }} qm</h4>
|
||||
<p class="text-muted mb-0">Verpachtete Fläche</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_js %}
|
||||
<script>
|
||||
// Auto-refresh dashboard every 5 minutes
|
||||
setTimeout(function() {
|
||||
location.reload();
|
||||
}, 300000);
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -6,7 +6,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:geschichte_list' %}">Geschichte</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ seite.get_absolute_url }}">{{ seite.titel }}</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Bild löschen</li>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:geschichte_list' %}">Geschichte</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ seite.get_absolute_url }}">{{ seite.titel }}</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Bild hinzufügen</li>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:geschichte_list' %}">Geschichte</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ seite.titel }}</li>
|
||||
</ol>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:geschichte_list' %}">Geschichte</a></li>
|
||||
{% if seite %}
|
||||
<li class="breadcrumb-item"><a href="{{ seite.get_absolute_url }}">{{ seite.titel }}</a></li>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Geschichte</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
</h6>
|
||||
<div>
|
||||
<a href="{% url 'stiftung:home' %}" class="btn btn-outline-secondary btn-sm">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zum Dashboard
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Startseite
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
</h6>
|
||||
<div>
|
||||
<a href="{% url 'stiftung:home' %}" class="btn btn-outline-secondary btn-sm">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zum Dashboard
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Startseite
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
|
||||
</ol>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
|
||||
</ol>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzung_detail' pk=unterstuetzung.pk %}">Unterstützung Details</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Als bezahlt markieren</li>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:home' %}">Home</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
|
||||
</ol>
|
||||
|
||||
Reference in New Issue
Block a user