diff --git a/compensation/forms.py b/compensation/forms.py index a86fbb6b..0741478a 100644 --- a/compensation/forms.py +++ b/compensation/forms.py @@ -48,6 +48,7 @@ class NewPaymentForm(BaseModalForm): ) def __init__(self, *args, **kwargs): + self.template = "modal/modal_form.html" super().__init__(*args, **kwargs) self.intervention = self.instance self.form_title = _("Payment") diff --git a/compensation/views.py b/compensation/views.py index 507aa2e0..12f9ba19 100644 --- a/compensation/views.py +++ b/compensation/views.py @@ -125,9 +125,9 @@ def new_payment_view(request: HttpRequest, intervention_id: str): Returns: """ - template = "modal/modal_form.html" intervention = get_object_or_404(Intervention, id=intervention_id) form = NewPaymentForm(request.POST or None, instance=intervention, user=request.user) + template = form.template if request.method == "POST": if form.is_valid(): payment = form.save() @@ -163,9 +163,9 @@ def payment_remove_view(request: HttpRequest, id: str): Returns: """ - template = "modal/modal_form.html" payment = get_object_or_404(Payment, id=id) form = RemoveModalForm(request.POST or None, instance=payment, user=request.user) + template = form.template if request.method == "POST": if form.is_valid(): form.save() diff --git a/intervention/templates/intervention/detail/related-documents.html b/intervention/templates/intervention/detail/related-documents.html index 20ab0633..4a246df0 100644 --- a/intervention/templates/intervention/detail/related-documents.html +++ b/intervention/templates/intervention/detail/related-documents.html @@ -12,12 +12,10 @@
- - - +
diff --git a/intervention/urls.py b/intervention/urls.py index 0f706591..792c5b66 100644 --- a/intervention/urls.py +++ b/intervention/urls.py @@ -7,12 +7,13 @@ Created on: 30.11.20 """ from django.urls import path -from intervention.views import index_view, new_view, open_view, edit_view, remove_view +from intervention.views import index_view, new_view, open_view, edit_view, remove_view, new_document_view app_name = "intervention" urlpatterns = [ path("", index_view, name="index"), path('new/', new_view, name='new'), + path('/document/new/', new_document_view, name='new-doc'), path('', open_view, name='open'), path('/edit', edit_view, name='edit'), path('/remove', remove_view, name='remove'), diff --git a/intervention/views.py b/intervention/views.py index a7c8481c..f3f5e72c 100644 --- a/intervention/views.py +++ b/intervention/views.py @@ -9,7 +9,7 @@ from intervention.models import Intervention from intervention.tables import InterventionTable from konova.contexts import BaseContext from konova.decorators import * -from konova.forms import RemoveForm, SimpleGeomForm +from konova.forms import RemoveForm, SimpleGeomForm, NewDocumentForm @login_required @@ -73,6 +73,45 @@ def new_view(request: HttpRequest): return render(request, template, context) +@login_required +def new_document_view(request: HttpRequest, id: str): + """ Renders a form for uploading new documents + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id to which the new document will be related + Returns: + + """ + form = NewDocumentForm(request.POST, request.FILES, user=request.user) + template = form.template + if request.method == "POST": + if form.is_valid(): + doc = form.save() + intervention = get_object_or_404(Intervention, id=id) + intervention.documents.add(doc) + messages.success( + request, + _("Document '{}' added").format(doc.title) + ) + + return redirect(request.META.get("HTTP_REFERER", "home")) + else: + messages.info( + request, + _("There was an error on this form.") + ) + return redirect(request.META.get("HTTP_REFERER", "home")) + elif request.method == "GET": + context = { + "form": form + } + context = BaseContext(request, context).context + return render(request, template, context) + else: + raise NotImplementedError + + @login_required def open_view(request: HttpRequest, id: str): """ Renders a detail view for viewing an intervention's data diff --git a/konova/forms.py b/konova/forms.py index b1a9a294..0fd5cc7d 100644 --- a/konova/forms.py +++ b/konova/forms.py @@ -13,19 +13,24 @@ from django import forms from django.contrib.auth.models import User from django.contrib.gis.forms import GeometryField, OSMWidget from django.contrib.gis.geos import Polygon +from django.db import transaction from django.utils import timezone from django.utils.translation import gettext_lazy as _ +from konova.models import Document + class BaseForm(forms.Form): """ Basic form for that holds attributes needed in all other forms """ + template = None action_url = None form_title = None cancel_redirect = None form_caption = None instance = None # The data holding model object + form_attrs = {} # Holds additional attributes, that can be used in the template def __init__(self, *args, **kwargs): self.instance = kwargs.pop("instance", None) @@ -152,6 +157,7 @@ class RemoveModalForm(BaseModalForm): ) def __init__(self, *args, **kwargs): + self.template = "modal/modal_form.html" super().__init__(*args, **kwargs) self.form_title = _("Remove") self.form_caption = _("Are you sure?") @@ -166,16 +172,54 @@ class RemoveModalForm(BaseModalForm): self.instance.delete() -class RemoveDocumentForm(BaseModalForm): - confirm = forms.BooleanField( - label=_("Confirm"), +class NewDocumentForm(BaseModalForm): + """ Modal form for new documents + + """ + title = forms.CharField( + max_length=500, + ) + creation_date = forms.DateField( + label=_("Created on"), label_suffix=_(""), - widget=forms.CheckboxInput(), - required=True, + help_text=_("When has this file been created? Important for photos."), + widget=forms.DateInput( + attrs={ + "type": "date", + "data-provide": "datepicker", + }, + format="%d.%m.%Y" + ) + ) + file = forms.FileField( + label=_("File"), + label_suffix=_(""), + help_text=_("Must be smaller than 15 Mb"), + ) + comment = forms.CharField( + required=False, + label=_("Comment"), + label_suffix=_(""), + help_text=_("Additional comment on this file"), + widget=forms.Textarea() ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.instance = kwargs.get("instance", None) - self.form_title = _("Remove document") - self.form_caption = _("This will remove '{}'. Are you sure?").format(self.instance.title) + self.form_title = _("Add new document") + self.form_caption = _("") + self.template = "modal/modal_form.html" + self.form_attrs = { + "enctype": "multipart/form-data", + } + + def save(self): + with transaction.atomic(): + doc = Document.objects.create( + created_by=self.user, + title=self.cleaned_data["title"], + comment=self.cleaned_data["comment"], + document=self.cleaned_data["file"], + date_of_creation=self.cleaned_data["creation_date"], + ) + return doc diff --git a/konova/urls.py b/konova/urls.py index dcb49427..85802d4c 100644 --- a/konova/urls.py +++ b/konova/urls.py @@ -20,7 +20,7 @@ from simple_sso.sso_client.client import Client from konova.autocompletes import OrganisationAutocomplete, NonOfficialOrganisationAutocomplete from konova.settings import SSO_SERVER, SSO_PUBLIC_KEY, SSO_PRIVATE_KEY, DEBUG -from konova.views import logout_view, home_view, get_document_view, new_document_view, remove_document_view +from konova.views import logout_view, home_view, get_document_view, remove_document_view sso_client = Client(SSO_SERVER, SSO_PUBLIC_KEY, SSO_PRIVATE_KEY) urlpatterns = [ @@ -35,9 +35,8 @@ urlpatterns = [ path('user/', include("user.urls")), path('news/', include("news.urls")), - # Documents + # Generic documents routes path('document/', get_document_view, name="doc-open"), - path('document/new', new_document_view, name="doc-new"), path('document//remove', remove_document_view, name="doc-remove"), # Autocomplete paths diff --git a/konova/views.py b/konova/views.py index b7f2087e..551b292d 100644 --- a/konova/views.py +++ b/konova/views.py @@ -84,23 +84,6 @@ def get_document_view(request: HttpRequest, id: str): return FileResponse(doc.document, as_attachment=True) -@login_required -def new_document_view(request: HttpRequest): - """ Renders a form for uploading new documents - - Args: - request (HttpRequest): The incoming request - - Returns: - - """ - template = "" - # TODO - context = {} - context = BaseContext(request, context).context - return render(request, template, context) - - @login_required def remove_document_view(request: HttpRequest, id: str): """ Renders a form for uploading new documents @@ -119,10 +102,10 @@ def remove_document_view(request: HttpRequest, id: str): Returns: """ - template = "modal/modal_form.html" doc = get_object_or_404(Document, id=id) title = doc.title form = RemoveModalForm(request.POST or None, instance=doc, user=request.user) + template = form.template if request.method == "POST": if form.is_valid(): doc.delete() diff --git a/templates/modal/modal_form.html b/templates/modal/modal_form.html index 79f347ff..4bea3283 100644 --- a/templates/modal/modal_form.html +++ b/templates/modal/modal_form.html @@ -5,7 +5,7 @@ {% endcomment %} -
+ {% csrf_token %}