diff --git a/src/c3nav/editor/models/changedobject.py b/src/c3nav/editor/models/changedobject.py index 3774ad61..42547d20 100644 --- a/src/c3nav/editor/models/changedobject.py +++ b/src/c3nav/editor/models/changedobject.py @@ -146,7 +146,7 @@ class ChangedObject(models.Model): setattr(instance, field.name, field.to_python(value)) elif field.many_to_one or field.one_to_one: if is_created_pk(value): - obj = self.changeset.get_created_object(field.related_model, value) + obj = self.changeset.get_created_object(field.related_model, value, allow_deleted=True) setattr(instance, field.get_cache_name(), obj) else: try: @@ -258,7 +258,7 @@ class ChangedObject(models.Model): return (self.updated_fields or self._m2m_added_cache or self._m2m_removed_cache or self.is_created or (not self.is_created and self.deleted)) - def save(self, *args, **kwargs): + def save(self, *args, standalone=False, **kwargs): if self.changeset.proposed is not None or self.changeset.applied is not None: raise TypeError('can not add change object to uneditable changeset.') self.m2m_added = {name: tuple(values) for name, values in self._m2m_added_cache.items()} @@ -266,12 +266,12 @@ class ChangedObject(models.Model): if not self.does_something: self.stale = True if not self.stale: - if self.changeset.pk is None: + if not standalone and self.changeset.pk is None: self.changeset.save() self.changeset = self.changeset else: self.existing_object_pk = None - if not self.changeset.fill_changes_cache(): + if not standalone and not self.changeset.fill_changes_cache(): self.update_changeset_cache() if not self.stale or self.pk is not None: super().save(*args, **kwargs) diff --git a/src/c3nav/editor/static/editor/css/editor.css b/src/c3nav/editor/static/editor/css/editor.css index 9f5c9da3..5953e7d7 100644 --- a/src/c3nav/editor/static/editor/css/editor.css +++ b/src/c3nav/editor/static/editor/css/editor.css @@ -92,10 +92,6 @@ a.list-group-item .badge { .itemtable td:first-child { padding-left:0; } -.itemtable td:last-child { - padding-right:0; - text-align:right; -} .itemtable tr.highlight td { background-color:#FFFFDD; } @@ -157,34 +153,6 @@ form button.invisiblesubmit { width:23px; padding-right:0; } -.change-group tr td:last-child { - white-space:nowrap; - text-align:right; -} -.change-group tr td .glyphicon { - top:2px; -} -.change-group tr td .tooltip { - font-size:14px; - margin-top: -1px; -} -.change-group tr td:last-child .btn { - margin-top: -6px; - margin-bottom: -2px; - margin-left: 5px; - margin-right: -5px; -} -.change-group .glyphicon-share-alt { - transform: scale(-1, 1); - -webkit-transform: scale(-1, 1); -} -.change-group tr td:last-child>i:last-child { - margin-right: -2px; -} -.change-group tr td:last-child>i { - margin-left: 7px; - margin-right: -2px; -} /* Styles inside leaflet */ .leaflet-container { diff --git a/src/c3nav/editor/templates/editor/changeset.html b/src/c3nav/editor/templates/editor/changeset.html index 2d73279b..222efa03 100644 --- a/src/c3nav/editor/templates/editor/changeset.html +++ b/src/c3nav/editor/templates/editor/changeset.html @@ -24,11 +24,15 @@ - - + {% if change.value %}{% else %}{% endif %}{{ change.title }}{% if change.value %}:{% else %}{% endif %} {{ change.value }} - {% endfor %} @@ -68,7 +60,7 @@
{% if can_edit %} - {% trans 'Edit' %} + {% trans 'Edit' %} {% endif %}
diff --git a/src/c3nav/editor/views/changes.py b/src/c3nav/editor/views/changes.py index 6795dbfd..cc0bc228 100644 --- a/src/c3nav/editor/views/changes.py +++ b/src/c3nav/editor/views/changes.py @@ -24,15 +24,20 @@ def changeset_detail(request, pk): can_edit = False changeset = get_object_or_404(ChangeSet.qs_for_request(request), pk=pk) - if request.method == 'POST': + if request.method == 'POST' and can_edit: restore = request.POST.get('restore') if restore and restore.isdigit(): - change = changeset.changes.filter(pk=restore).first() - if change is not None and change.can_restore: - if request.POST.get('restore_confirm') != '1': - return render(request, 'editor/changeset_restore_confirm.html', {'pk': change.pk}) - change.restore(request.user if request.user.is_authenticated else None) - messages.success(request, _('Original state has been restored!')) + try: + changed_object = changeset.changed_objects_set.get(pk=restore) + except: + pass + else: + if changed_object.deleted: + changed_object.deleted = False + changed_object.save(standalone=True) + messages.success(request, _('Object has been successfully restored!')) + + return redirect(reverse('editor.changesets.detail', kwargs={'pk': changeset.pk})) elif request.POST.get('delete') == '1': if request.POST.get('delete_confirm') == '1': @@ -78,7 +83,7 @@ def changeset_detail(request, pk): obj_desc = _('%(model)s #%(id)s') % {'model': obj.__class__._meta.verbose_name, 'id': pk} if is_created_pk(pk): - obj_still_exists = pk in changeset.created_objects[obj.__class__] + obj_still_exists = pk in changeset.created_objects.get(obj.__class__, ()) else: obj_still_exists = pk not in changeset.deleted_existing.get(obj.__class__, ()) @@ -96,10 +101,12 @@ def changeset_detail(request, pk): changed_object_data = { 'model': obj.__class__, 'model_title': obj.__class__._meta.verbose_name, + 'pk': changed_object.pk, 'desc': obj_desc, 'title': obj.title if getattr(obj, 'titles', None) else None, 'changes': changes, 'edit_url': edit_url, + 'deleted': changed_object.deleted, 'order': (changed_object.deleted and changed_object.is_created, not changed_object.is_created), } changed_objects_data.append(changed_object_data) @@ -210,7 +217,6 @@ def changeset_detail(request, pk): created = _('created at %(datetime)s') % {'datetime': date_format(changeset.created, 'DATETIME_FORMAT')} ctx = { - 'pk': changeset.pk, 'changeset': changeset, 'created': created, 'can_edit': can_edit,
+ {% if obj.edit_url %} {% trans 'Edit' %} + {% elif obj.deleted and can_edit %} + {% endif %} {% if obj.title %} {{ obj.title }} ({{ obj.desc }}) @@ -42,22 +46,10 @@ {% for change in obj.changes %}
- {% if change.apply_problem %} - - {% elif change.has_no_effect %} - - {% endif %} - {% if change.can_restore %} - - {% endif %} -