From 9d4a6b9d468263fe133cf21859d7da8b76565ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Mon, 26 Aug 2024 21:03:32 +0200 Subject: [PATCH] show edit_url in changeset view and fix some bugs --- src/c3nav/editor/views/changes.py | 39 +++++++++++++++++++------------ 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/c3nav/editor/views/changes.py b/src/c3nav/editor/views/changes.py index 883921ef..f31bbf2a 100644 --- a/src/c3nav/editor/views/changes.py +++ b/src/c3nav/editor/views/changes.py @@ -4,9 +4,11 @@ from django.apps import apps from django.conf import settings from django.contrib import messages from django.core.cache import cache +from django.db.models.fields.related import ManyToManyField from django.http import Http404 from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse +from django.urls.exceptions import NoReverseMatch from django.utils.text import format_lazy from django.utils.translation import get_language_info, get_language from django.utils.translation import gettext_lazy as _ @@ -189,22 +191,8 @@ def changeset_detail(request, pk): ctx['changed_objects'] = changed_objects_data return render(request, 'editor/changeset.html', ctx) - objects = changeset.get_objects() - changed_objects_data = [] - # added_redirects = {} - # removed_redirects = {} - # for changed_object in changeset.changed_objects.get(LocationRedirect, {}).values(): - # if changed_object.is_created == changed_object.deleted: - # continue - # obj = objects[LocationRedirect][changed_object.obj_pk] - # redirect_list = (removed_redirects if changed_object.deleted else added_redirects) - # redirect_list.setdefault(obj.target_id, []).append(obj.slug) - # - # redirect_changed_objects = [] - # todo: display redirects nicely - added_redirects = {} removed_redirects = {} for changed_object in changeset.changes.changed_objects: @@ -232,6 +220,21 @@ def changeset_detail(request, pk): else: title = next(iter(changed_object.titles.values())) + prev_values = changeset.changes.prev_values[changed_object.obj.model][changed_object.obj.id] + + edit_url = None + if not changed_object.deleted: + # todo: only if it's active + reverse_kwargs = {'pk': changed_object.obj.id} + if "space" in prev_values: + reverse_kwargs["space"] = changed_object.fields.get("space", prev_values["space"]) + elif "level" in prev_values: + reverse_kwargs["level"] = changed_object.fields.get("level", prev_values["level"]) + try: + edit_url = reverse('editor.' + model._meta.default_related_name + '.edit', kwargs=reverse_kwargs) + except NoReverseMatch: + pass + changed_object_data = { 'model': model, 'model_title': model._meta.verbose_name, @@ -239,7 +242,7 @@ def changeset_detail(request, pk): 'desc': format_lazy(_('{model} #{id}'), model=model._meta.verbose_name, id=changed_object.obj.id), 'title': title, 'changes': changes, - 'edit_url': None, + 'edit_url': edit_url, 'deleted': changed_object.deleted, } @@ -267,6 +270,7 @@ def changeset_detail(request, pk): 'title': _('created geometry') if changed_object.created else _('edited geometry'), 'order': (8,), }) + update_changes.append(change_data) elif name == 'data': change_data.update({ 'icon': 'signal', @@ -275,6 +279,7 @@ def changeset_detail(request, pk): 'title': _('created scan data') if changed_object.created else _('edited scan data'), 'order': (9,), }) + update_changes.append(change_data) else: field = model._meta.get_field(name) field_title = field.verbose_name @@ -299,8 +304,12 @@ def changeset_detail(request, pk): 'order': (4, tuple(code for code, title in settings.LANGUAGES).index(lang)), }) update_changes.append(sub_change_data) + elif isinstance(field, ManyToManyField): + continue else: if value == '' or value is None: + if changed_object.created: + continue change_data.update({ 'empty': True, 'title': format_lazy(_('remove {field_title}'), field_title=field_title),