210 lines
6.8 KiB
Python
210 lines
6.8 KiB
Python
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib import messages
|
|
from django.urls import reverse
|
|
from django.http import Http404
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.core.paginator import Paginator
|
|
from .models import Notiz
|
|
from .forms import NotizForm, NotizAttachForm
|
|
import markdown
|
|
|
|
|
|
@login_required
|
|
def notizen_list(request):
|
|
"""List all notes created by the user."""
|
|
notizen = Notiz.objects.filter(erstellt_von=request.user)
|
|
|
|
# Pagination
|
|
paginator = Paginator(notizen, 10)
|
|
page_number = request.GET.get('page')
|
|
page_obj = paginator.get_page(page_number)
|
|
|
|
context = {
|
|
'page_obj': page_obj,
|
|
'notizen': page_obj,
|
|
}
|
|
return render(request, 'notizen/list.html', context)
|
|
|
|
|
|
@login_required
|
|
def notiz_detail(request, pk):
|
|
"""Display a single note."""
|
|
notiz = get_object_or_404(Notiz, pk=pk, erstellt_von=request.user)
|
|
|
|
# Convert markdown to HTML
|
|
html_content = markdown.markdown(notiz.inhalt, extensions=['markdown.extensions.fenced_code'])
|
|
|
|
context = {
|
|
'notiz': notiz,
|
|
'html_content': html_content,
|
|
}
|
|
return render(request, 'notizen/detail.html', context)
|
|
|
|
|
|
@login_required
|
|
def notiz_create(request):
|
|
"""Create a new note."""
|
|
if request.method == 'POST':
|
|
form = NotizForm(request.POST)
|
|
if form.is_valid():
|
|
notiz = form.save(commit=False)
|
|
notiz.erstellt_von = request.user
|
|
notiz.save()
|
|
messages.success(request, f'Notiz "{notiz.name}" wurde erfolgreich erstellt.')
|
|
return redirect('notizen:detail', pk=notiz.pk)
|
|
else:
|
|
form = NotizForm()
|
|
|
|
context = {
|
|
'form': form,
|
|
'title': 'Neue Notiz erstellen',
|
|
}
|
|
return render(request, 'notizen/form.html', context)
|
|
|
|
|
|
@login_required
|
|
def notiz_edit(request, pk):
|
|
"""Edit an existing note."""
|
|
notiz = get_object_or_404(Notiz, pk=pk, erstellt_von=request.user)
|
|
|
|
if request.method == 'POST':
|
|
form = NotizForm(request.POST, instance=notiz)
|
|
if form.is_valid():
|
|
form.save()
|
|
messages.success(request, f'Notiz "{notiz.name}" wurde erfolgreich aktualisiert.')
|
|
return redirect('notizen:detail', pk=notiz.pk)
|
|
else:
|
|
form = NotizForm(instance=notiz)
|
|
|
|
context = {
|
|
'form': form,
|
|
'notiz': notiz,
|
|
'title': f'Notiz "{notiz.name}" bearbeiten',
|
|
}
|
|
return render(request, 'notizen/form.html', context)
|
|
|
|
|
|
@login_required
|
|
def notiz_delete(request, pk):
|
|
"""Delete a note."""
|
|
notiz = get_object_or_404(Notiz, pk=pk, erstellt_von=request.user)
|
|
|
|
if request.method == 'POST':
|
|
name = notiz.name
|
|
notiz.delete()
|
|
messages.success(request, f'Notiz "{name}" wurde erfolgreich gelöscht.')
|
|
return redirect('notizen:list')
|
|
|
|
context = {
|
|
'notiz': notiz,
|
|
}
|
|
return render(request, 'notizen/confirm_delete.html', context)
|
|
|
|
|
|
@login_required
|
|
def attach_notiz(request, content_type_id, object_id):
|
|
"""Attach a new note to an object."""
|
|
try:
|
|
content_type = ContentType.objects.get(id=content_type_id)
|
|
content_object = content_type.get_object_for_this_type(id=object_id)
|
|
except (ContentType.DoesNotExist, content_type.model_class().DoesNotExist):
|
|
raise Http404("Objekt nicht gefunden")
|
|
|
|
if request.method == 'POST':
|
|
form = NotizAttachForm(request.POST, content_object=content_object)
|
|
if form.is_valid():
|
|
notiz = form.save(commit=False)
|
|
notiz.erstellt_von = request.user
|
|
notiz.save()
|
|
messages.success(request, f'Notiz "{notiz.name}" wurde erfolgreich an {content_object} angehängt.')
|
|
|
|
# Redirect back to the object's detail page
|
|
if hasattr(content_object, 'get_absolute_url'):
|
|
return redirect(content_object.get_absolute_url())
|
|
else:
|
|
return redirect('notizen:detail', pk=notiz.pk)
|
|
else:
|
|
form = NotizAttachForm(content_object=content_object)
|
|
|
|
context = {
|
|
'form': form,
|
|
'content_object': content_object,
|
|
'title': f'Notiz an {content_object} anhängen',
|
|
}
|
|
return render(request, 'notizen/attach_form.html', context)
|
|
|
|
|
|
@login_required
|
|
def object_notizen(request, content_type_id, object_id):
|
|
"""Display all notes attached to an object."""
|
|
try:
|
|
content_type = ContentType.objects.get(id=content_type_id)
|
|
content_object = content_type.get_object_for_this_type(id=object_id)
|
|
except (ContentType.DoesNotExist, content_type.model_class().DoesNotExist):
|
|
raise Http404("Objekt nicht gefunden")
|
|
|
|
notizen = Notiz.objects.filter(
|
|
content_type=content_type,
|
|
object_id=object_id
|
|
)
|
|
|
|
# Convert markdown to HTML for each note
|
|
notizen_with_html = []
|
|
for notiz in notizen:
|
|
html_content = markdown.markdown(notiz.inhalt, extensions=['markdown.extensions.fenced_code'])
|
|
notizen_with_html.append({
|
|
'notiz': notiz,
|
|
'html_content': html_content
|
|
})
|
|
|
|
context = {
|
|
'content_object': content_object,
|
|
'notizen_with_html': notizen_with_html,
|
|
}
|
|
return render(request, 'notizen/object_notizen.html', context)
|
|
|
|
|
|
@login_required
|
|
def attach_page_notiz(request, page_identifier):
|
|
"""Attach a note to a specific page/overview."""
|
|
from .models import Page
|
|
|
|
# Get or create the page object
|
|
page, created = Page.objects.get_or_create(
|
|
identifier=page_identifier,
|
|
defaults={
|
|
'name': page_identifier.replace('_', ' ').title(),
|
|
'description': f'Übersichtsseite für {page_identifier}'
|
|
}
|
|
)
|
|
|
|
if request.method == 'POST':
|
|
form = NotizAttachForm(request.POST)
|
|
if form.is_valid():
|
|
notiz = form.save(commit=False)
|
|
notiz.erstellt_von = request.user
|
|
notiz.content_object = page
|
|
notiz.save()
|
|
|
|
messages.success(request, f'Notiz "{notiz.name}" wurde erfolgreich zur Seite "{page.name}" hinzugefügt.')
|
|
|
|
# Redirect back to the page where the note was added
|
|
redirect_urls = {
|
|
'patient_overview': 'bird_all',
|
|
'aviary_overview': 'aviary_all',
|
|
'contact_overview': 'contact_all',
|
|
'costs_overview': 'costs_all',
|
|
}
|
|
|
|
redirect_url = redirect_urls.get(page_identifier, 'notizen:list')
|
|
return redirect(redirect_url)
|
|
else:
|
|
form = NotizAttachForm()
|
|
|
|
context = {
|
|
'form': form,
|
|
'page': page,
|
|
'page_identifier': page_identifier,
|
|
}
|
|
return render(request, 'notizen/attach_page.html', context)
|