Add Geschichte (History) wiki-style feature with reorganized navigation
🆕 NEW FEATURES: - Wiki-style Geschichte (History) section with rich text editor - Image upload support for history pages - Quill.js rich text editor with formatting options - Slug-based URLs for SEO-friendly history pages - Image galleries with descriptions and alt-text support 🔧 MODELS: - GeschichteSeite: Main history pages with rich content - GeschichteBild: Image attachments for history pages - Auto-generated slugs, sorting, publishing controls 📝 TEMPLATES: - geschichte/liste.html: Card-based overview of all history pages - geschichte/detail.html: Full page view with image gallery - geschichte/form.html: Rich text editor for creating/editing pages - geschichte/bild_form.html: Image upload interface 🎨 UI IMPROVEMENTS: - Reorganized navigation menu into logical groups: * Menschen & Finanzen (People & Finance) * Immobilien & Land (Real Estate & Land) * Verwaltung (Administration) * Geschichte (History) - More compact menu design saving horizontal space - Better grouping with dropdown headers 🛠️ TECHNICAL: - Rich text editor with Quill.js integration - Image upload with validation and optimization - Permission-based access controls - Responsive design for all screen sizes - Proper breadcrumb navigation - Auto-slug generation from titles
This commit is contained in:
@@ -8030,3 +8030,125 @@ def backup_tokens(request):
|
||||
}
|
||||
|
||||
return render(request, 'stiftung/auth/backup_tokens_manage.html', context)
|
||||
|
||||
|
||||
# Geschichte (History) Views
|
||||
from .models import GeschichteSeite, GeschichteBild
|
||||
from .forms import GeschichteSeiteForm, GeschichteBildForm
|
||||
|
||||
|
||||
@login_required
|
||||
def geschichte_list(request):
|
||||
"""List all published history pages"""
|
||||
seiten = GeschichteSeite.objects.filter(ist_veroeffentlicht=True).order_by('sortierung', 'titel')
|
||||
|
||||
context = {
|
||||
'seiten': seiten,
|
||||
'title': 'Geschichte der Stiftung'
|
||||
}
|
||||
|
||||
return render(request, 'stiftung/geschichte/liste.html', context)
|
||||
|
||||
|
||||
@login_required
|
||||
def geschichte_detail(request, slug):
|
||||
"""Display a specific history page"""
|
||||
seite = get_object_or_404(GeschichteSeite, slug=slug, ist_veroeffentlicht=True)
|
||||
bilder = seite.bilder.all().order_by('sortierung', 'titel')
|
||||
|
||||
context = {
|
||||
'seite': seite,
|
||||
'bilder': bilder,
|
||||
'title': seite.titel
|
||||
}
|
||||
|
||||
return render(request, 'stiftung/geschichte/detail.html', context)
|
||||
|
||||
|
||||
@login_required
|
||||
def geschichte_create(request):
|
||||
"""Create a new history page"""
|
||||
if not request.user.has_perm('stiftung.add_geschichteseite'):
|
||||
messages.error(request, 'Sie haben keine Berechtigung, neue Geschichtsseiten zu erstellen.')
|
||||
return redirect('stiftung:geschichte_list')
|
||||
|
||||
if request.method == 'POST':
|
||||
form = GeschichteSeiteForm(request.POST)
|
||||
if form.is_valid():
|
||||
seite = form.save(commit=False)
|
||||
seite.erstellt_von = request.user
|
||||
seite.aktualisiert_von = request.user
|
||||
seite.save()
|
||||
|
||||
messages.success(request, f'Geschichtsseite "{seite.titel}" wurde erfolgreich erstellt.')
|
||||
return redirect('stiftung:geschichte_detail', slug=seite.slug)
|
||||
else:
|
||||
form = GeschichteSeiteForm()
|
||||
|
||||
context = {
|
||||
'form': form,
|
||||
'title': 'Neue Geschichtsseite'
|
||||
}
|
||||
|
||||
return render(request, 'stiftung/geschichte/form.html', context)
|
||||
|
||||
|
||||
@login_required
|
||||
def geschichte_edit(request, slug):
|
||||
"""Edit an existing history page"""
|
||||
seite = get_object_or_404(GeschichteSeite, slug=slug)
|
||||
|
||||
if not request.user.has_perm('stiftung.change_geschichteseite'):
|
||||
messages.error(request, 'Sie haben keine Berechtigung, diese Geschichtsseite zu bearbeiten.')
|
||||
return redirect('stiftung:geschichte_detail', slug=slug)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = GeschichteSeiteForm(request.POST, instance=seite)
|
||||
if form.is_valid():
|
||||
seite = form.save(commit=False)
|
||||
seite.aktualisiert_von = request.user
|
||||
seite.save()
|
||||
|
||||
messages.success(request, f'Geschichtsseite "{seite.titel}" wurde erfolgreich aktualisiert.')
|
||||
return redirect('stiftung:geschichte_detail', slug=seite.slug)
|
||||
else:
|
||||
form = GeschichteSeiteForm(instance=seite)
|
||||
|
||||
context = {
|
||||
'form': form,
|
||||
'seite': seite,
|
||||
'title': f'Bearbeiten: {seite.titel}'
|
||||
}
|
||||
|
||||
return render(request, 'stiftung/geschichte/form.html', context)
|
||||
|
||||
|
||||
@login_required
|
||||
def geschichte_bild_upload(request, slug):
|
||||
"""Upload images to a history page"""
|
||||
seite = get_object_or_404(GeschichteSeite, slug=slug)
|
||||
|
||||
if not request.user.has_perm('stiftung.add_geschichtebild'):
|
||||
messages.error(request, 'Sie haben keine Berechtigung, Bilder hochzuladen.')
|
||||
return redirect('stiftung:geschichte_detail', slug=slug)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = GeschichteBildForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
bild = form.save(commit=False)
|
||||
bild.seite = seite
|
||||
bild.hochgeladen_von = request.user
|
||||
bild.save()
|
||||
|
||||
messages.success(request, f'Bild "{bild.titel}" wurde erfolgreich hochgeladen.')
|
||||
return redirect('stiftung:geschichte_detail', slug=slug)
|
||||
else:
|
||||
form = GeschichteBildForm()
|
||||
|
||||
context = {
|
||||
'form': form,
|
||||
'seite': seite,
|
||||
'title': f'Bild hochladen: {seite.titel}'
|
||||
}
|
||||
|
||||
return render(request, 'stiftung/geschichte/bild_form.html', context)
|
||||
|
||||
Reference in New Issue
Block a user