show missing dependencies in changeset view
This commit is contained in:
parent
b2158bb781
commit
106bc6fa17
4 changed files with 29 additions and 11 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue