show missing dependencies in changeset view

This commit is contained in:
Laura Klünder 2017-07-07 16:20:03 +02:00
parent b2158bb781
commit 106bc6fa17
4 changed files with 29 additions and 11 deletions

View file

@ -253,9 +253,10 @@ class ChangedObject(models.Model):
return False
return True
def can_restore(self, force_query=False):
def get_missing_dependencies(self, force_query=False, max_one=False):
result = set()
if not self.deleted:
return False
return result
for field in self.model_class._meta.get_fields():
if not field.many_to_one:
continue
@ -273,19 +274,22 @@ class ChangedObject(models.Model):
qs = self.changeset.changed_objects_set.filter(content_type=related_content_type)
if is_created_pk(pk):
if not qs.filter(pk=int(pk[2:]), deleted=False).exists():
return False
result.add(field.name)
else:
if qs.filter(existing_object_pk=pk, deleted=True).exists():
return False
result.add(field.name)
else:
if is_created_pk(pk):
if pk not in self.changeset.created_objects.get(related_model, ()):
return False
result.add(field.name)
else:
if pk in self.changeset.deleted_existing.get(related_model, ()):
return False
result.add(field.name)
return True
if result and max_one:
return result
return result
def mark_deleted(self):
if not self.can_delete():
@ -345,6 +349,10 @@ class ChangedObject(models.Model):
self.m2m_set(name)
def restore(self):
if self.deleted is False:
return
if self.get_missing_dependencies(force_query=True, max_one=True):
raise PermissionError
self.deleted = False
self.save(standalone=True)

View file

@ -143,6 +143,9 @@ form button.invisiblesubmit {
border-bottom:1px;
border-bottom-style:solid;
}
.change-group .glyphicon.pull-right {
margin-top: 3px;
}
.change-group tr th small {
font-weight:normal;
}

View file

@ -90,7 +90,7 @@
<a class="btn btn-default btn-xs pull-right" data-force-next-zoom href="{{ obj.edit_url }}">
{% trans 'Edit' %}
</a>
{% elif obj.deleted and can_edit and obj.can_restore %}
{% elif obj.deleted and can_edit and not obj.missing_dependencies %}
<button type="submit" name="restore" value="{{ obj.pk }}" class="btn btn-warning btn-xs pull-right">
{% trans 'Restore' %}
</button>
@ -108,6 +108,7 @@
<tr>
<td class="text-{{ change.class }}"><i class="glyphicon glyphicon-{{ change.icon }}"></i></td>
<td{% if obj.deleted and change.icon != 'minus' %} class="text-muted"{% endif %}>
{% if change.missing_dependency %}<i class="glyphicon glyphicon-alert pull-right text-warning"></i>{% endif %}
{% if change.value %}<u>{% else %}<em>{% endif %}{{ change.title }}{% if change.value %}</u>:{% else %}</em>{% endif %}
{{ change.value }}
</td>

View file

@ -9,6 +9,7 @@ from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.text import format_lazy
from django.utils.translation import ugettext_lazy as _
from rest_framework.exceptions import PermissionDenied
from c3nav.editor.forms import ChangeSetForm, RejectForm
from c3nav.editor.models import ChangeSet
@ -43,12 +44,13 @@ def changeset_detail(request, pk):
except:
pass
else:
if changed_object.can_restore(force_query=True):
try:
changed_object.restore()
messages.success(request, _('Object has been successfully restored.'))
else:
except PermissionDenied:
messages.error(request, _('You cannot restore this object, because '
'it depends on a deleted object.'))
else:
messages.error(request, _('You can not edit changes on this change set.'))
@ -228,6 +230,7 @@ def changeset_detail(request, pk):
kwargs=reverse_kwargs)
changes = []
missing_dependencies = changed_object.get_missing_dependencies()
changed_object_data = {
'model': obj.__class__,
'model_title': obj.__class__._meta.verbose_name,
@ -237,7 +240,7 @@ def changeset_detail(request, pk):
'changes': changes,
'edit_url': edit_url,
'deleted': changed_object.deleted,
'can_restore': changed_object.can_restore(),
'missing_dependencies': missing_dependencies,
'order': (changed_object.deleted and changed_object.is_created, not changed_object.is_created),
}
changed_objects_data.append(changed_object_data)
@ -283,6 +286,9 @@ def changeset_detail(request, pk):
field_value = field.to_python(value)
if field.related_model is not None:
field_value = objects[field.related_model][field_value].title
change_data.update({
'missing_dependency': field.name in missing_dependencies,
})
order = 5
if name == 'slug':
order = 1