feat: harden dashboard editing and translations
This commit is contained in:
@@ -201,23 +201,26 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
return redirect(request.get_full_path())
|
||||
previous_status = claim.status
|
||||
claim.decision_note = decision_note
|
||||
new_project = form.cleaned_data.get("project")
|
||||
project_changed = False
|
||||
if new_project is not None and new_project != claim.project:
|
||||
claim.project = new_project
|
||||
project_changed = True
|
||||
|
||||
if action == ClaimDecisionForm.ACTION_APPROVE:
|
||||
claim.status = Claim.Status.APPROVED
|
||||
messages.success(request, _("%(claim)s markerades som godkänd.") % {"claim": claim})
|
||||
target_status = Claim.Status.APPROVED
|
||||
feedback = messages.success
|
||||
feedback_msg = _("%(claim)s markerades som godkänd.")
|
||||
elif action == ClaimDecisionForm.ACTION_REJECT:
|
||||
target_status = Claim.Status.REJECTED
|
||||
feedback = messages.warning
|
||||
feedback_msg = _("%(claim)s markerades som nekad.")
|
||||
else:
|
||||
claim.status = Claim.Status.REJECTED
|
||||
messages.warning(request, _("%(claim)s markerades som nekad.") % {"claim": claim})
|
||||
target_status = Claim.Status.PENDING
|
||||
feedback = messages.info
|
||||
feedback_msg = _("%(claim)s återställdes till väntande status.")
|
||||
|
||||
update_fields = ["status", "decision_note", "updated_at"]
|
||||
if project_changed:
|
||||
update_fields.append("project")
|
||||
status_changed = previous_status != target_status
|
||||
update_fields = ["decision_note", "updated_at"]
|
||||
if status_changed:
|
||||
claim.status = target_status
|
||||
update_fields.append("status")
|
||||
claim.save(update_fields=update_fields)
|
||||
feedback(request, feedback_msg % {"claim": claim})
|
||||
claim.add_log(
|
||||
action=ClaimLog.Action.STATUS_CHANGED,
|
||||
performed_by=request.user,
|
||||
@@ -225,12 +228,6 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
to_status=claim.status,
|
||||
note=decision_note,
|
||||
)
|
||||
if project_changed:
|
||||
claim.add_log(
|
||||
action=ClaimLog.Action.PROJECT_CHANGED,
|
||||
performed_by=request.user,
|
||||
note=_("Project updated during decision."),
|
||||
)
|
||||
return redirect(request.get_full_path())
|
||||
|
||||
def _handle_payment(self, request):
|
||||
@@ -265,6 +262,12 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
messages.error(request, _("Du har inte behörighet att uppdatera utlägg."))
|
||||
return redirect(request.get_full_path())
|
||||
claim = get_object_or_404(Claim, pk=request.POST.get("edit_claim_id"))
|
||||
if claim.status != Claim.Status.PENDING:
|
||||
messages.error(request, _("Endast väntande utlägg kan redigeras via panelen."))
|
||||
return redirect(request.get_full_path())
|
||||
original_values = {}
|
||||
for field in ClaimEditForm.Meta.fields:
|
||||
original_values[field] = getattr(claim, field)
|
||||
form = ClaimEditForm(request.POST, instance=claim)
|
||||
if not form.is_valid():
|
||||
for error in form.errors.get("__all__", []):
|
||||
@@ -277,12 +280,19 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
return redirect(request.get_full_path())
|
||||
|
||||
updated_claim = form.save()
|
||||
changed_fields = []
|
||||
def _format_value(value):
|
||||
if value is None:
|
||||
return "-"
|
||||
return str(value)
|
||||
|
||||
change_notes = []
|
||||
for field in form.changed_data:
|
||||
label = form.fields[field].label or field
|
||||
changed_fields.append(str(label))
|
||||
if changed_fields:
|
||||
note = _("Fields updated: %(fields)s") % {"fields": ", ".join(changed_fields)}
|
||||
old_value = _format_value(original_values.get(field))
|
||||
new_value = _format_value(getattr(updated_claim, field))
|
||||
change_notes.append(f"{label}: {old_value} → {new_value}")
|
||||
if change_notes:
|
||||
note = _("Följande fält uppdaterades: %(fields)s") % {"fields": "; ".join(change_notes)}
|
||||
claim.add_log(
|
||||
action=ClaimLog.Action.DETAILS_EDITED,
|
||||
performed_by=request.user,
|
||||
|
||||
Reference in New Issue
Block a user