Compare commits

...

2 Commits

Author SHA1 Message Date
mipel
46e1a9af86 #7 New Form
* links edit button in detail view with edit functionality
* fixes minor comment rendering bug
* fixes bug where compensation changes won't save
2021-10-04 16:18:59 +02:00
mipel
d0aa125248 #7 New Form
* fixes bug where geometries have been created each time a SimpleGeomForm has been saved
2021-10-04 16:06:20 +02:00
6 changed files with 114 additions and 11 deletions

View File

@ -22,6 +22,11 @@ from user.models import UserActionLogEntry, UserAction
class NewCompensationForm(BaseForm): class NewCompensationForm(BaseForm):
""" Form for creating new compensations.
Can be initialized with an intervention id for preselecting the related intervention.
"""
identifier = forms.CharField( identifier = forms.CharField(
label=_("Identifier"), label=_("Identifier"),
label_suffix="", label_suffix="",
@ -145,3 +150,53 @@ class NewCompensationForm(BaseForm):
return comp return comp
class EditCompensationForm(NewCompensationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form_title = _("Edit compensation")
self.action_url = reverse("compensation:edit", args=(self.instance.id,))
self.cancel_redirect = reverse("compensation:open", args=(self.instance.id,))
# Initialize form data
form_data = {
"identifier": self.instance.identifier,
"title": self.instance.title,
"intervention": self.instance.intervention,
"fundings": self.instance.fundings.all(),
"comment": self.instance.comment,
}
disabled_fields = []
self.load_initial_data(
form_data,
disabled_fields
)
def save(self, user: User, geom_form: SimpleGeomForm):
with transaction.atomic():
# Fetch data from cleaned POST values
identifier = self.cleaned_data.get("identifier", None)
title = self.cleaned_data.get("title", None)
fundings = self.cleaned_data.get("fundings", None)
intervention = self.cleaned_data.get("intervention", None)
comment = self.cleaned_data.get("comment", None)
# Create log entry
action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.EDITED,
)
# Process the geometry form
geometry = geom_form.save(action)
# Finally create main object
self.instance.identifier = identifier
self.instance.title = title
self.instance.intervention = intervention
self.instance.geometry = geometry
self.instance.comment = comment
self.instance.fundings.set(fundings)
self.instance.save()
self.instance.log.add(action)
return self.instance

View File

@ -1,6 +1,6 @@
{% load i18n fontawesome_5 %} {% load i18n fontawesome_5 %}
{% if intervention.comment %} {% if obj.comment %}
<div class="w-100"> <div class="w-100">
<div class="card mt-3"> <div class="card mt-3">
<div class="card-header rlp-r"> <div class="card-header rlp-r">

View File

@ -13,7 +13,7 @@
</a> </a>
{% if has_access %} {% if has_access %}
{% if is_default_member %} {% if is_default_member %}
<a href="{% url 'home' %}" class="mr-2"> <a href="{% url 'compensation:edit' obj.id %}" class="mr-2">
<button class="btn btn-default" title="{% trans 'Edit' %}"> <button class="btn btn-default" title="{% trans 'Edit' %}">
{% fa5_icon 'edit' %} {% fa5_icon 'edit' %}
</button> </button>

View File

@ -75,7 +75,7 @@
</div> </div>
<br> <br>
{% empty %} {% empty %}
None {% trans 'None' %}
{% endfor %} {% endfor %}
</td> </td>
</tr> </tr>

View File

@ -1,10 +1,10 @@
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.db.models import Sum from django.db.models import Sum
from django.http import HttpRequest, JsonResponse from django.http import HttpRequest, JsonResponse
from django.shortcuts import render, get_object_or_404 from django.shortcuts import render
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from compensation.forms.forms import NewCompensationForm from compensation.forms.forms import NewCompensationForm, EditCompensationForm
from compensation.forms.modalForms import NewStateModalForm, NewDeadlineModalForm, NewActionModalForm from compensation.forms.modalForms import NewStateModalForm, NewDeadlineModalForm, NewActionModalForm
from compensation.models import Compensation, CompensationState, CompensationAction, CompensationDocument from compensation.models import Compensation, CompensationState, CompensationAction, CompensationDocument
from compensation.tables import CompensationTable from compensation.tables import CompensationTable
@ -110,8 +110,38 @@ def new_id_view(request: HttpRequest):
@login_required @login_required
@default_group_required @default_group_required
def edit_view(request: HttpRequest, id: str): def edit_view(request: HttpRequest, id: str):
# ToDo """
Renders a view for editing compensations
Args:
request (HttpRequest): The incoming request
Returns:
"""
template = "compensation/new/view.html"
# Get object from db
comp = get_object_or_404(Compensation, id=id)
# Create forms, initialize with values from db/from POST request
data_form = EditCompensationForm(request.POST or None, instance=comp)
geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=comp)
if request.method == "POST":
if data_form.is_valid() and geom_form.is_valid():
# The data form takes the geom form for processing, as well as the performing user
comp = data_form.save(request.user, geom_form)
messages.success(request, _("Compensation {} edited").format(comp.identifier))
return redirect("compensation:open", id=comp.id)
else:
messages.error(request, FORM_INVALID)
else:
# For clarification: nothing in this case
pass pass
context = {
"form": data_form,
"geom_form": geom_form,
}
context = BaseContext(request, context).context
return render(request, template, context)
@login_required @login_required

View File

@ -275,10 +275,28 @@ class SimpleGeomForm(BaseForm):
self.fields["geom"].disabled = True self.fields["geom"].disabled = True
def save(self, action: UserActionLogEntry): def save(self, action: UserActionLogEntry):
""" Saves the form's geometry
Creates a new geometry entry if none is set, yet
Args:
action ():
Returns:
"""
if self.instance.geometry is None:
geometry = Geometry.objects.create( geometry = Geometry.objects.create(
geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID)), geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID)),
created=action, created=action,
) )
self.instance.geometry = geometry
self.instance.save()
else:
geometry = self.instance.geometry
geometry.geom = self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID))
geometry.modified = action
geometry.save()
return geometry return geometry