restore objects using editor API
This commit is contained in:
parent
1594e09189
commit
f5132c6552
2 changed files with 34 additions and 1 deletions
|
@ -344,6 +344,7 @@ class ChangeSetViewSet(ReadOnlyModelViewSet):
|
||||||
/{id}/changes/ list all changes of a given changeset.
|
/{id}/changes/ list all changes of a given changeset.
|
||||||
/{id}/activate/ POST to activate given changeset.
|
/{id}/activate/ POST to activate given changeset.
|
||||||
/{id}/edit/ POST to edit given changeset (provide title and description in POST data).
|
/{id}/edit/ POST to edit given changeset (provide title and description in POST data).
|
||||||
|
/{id}/restore_object/ POST to restore an object deleted by this changeset (provide change id as id in POST data).
|
||||||
/{id}/delete/ POST to delete given changeset.
|
/{id}/delete/ POST to delete given changeset.
|
||||||
/{id}/propose/ POST to propose given changeset.
|
/{id}/propose/ POST to propose given changeset.
|
||||||
/{id}/unpropose/ POST to unpropose given changeset.
|
/{id}/unpropose/ POST to unpropose given changeset.
|
||||||
|
@ -472,6 +473,37 @@ class ChangeSetViewSet(ReadOnlyModelViewSet):
|
||||||
changeset.save()
|
changeset.save()
|
||||||
return Response({'success': True})
|
return Response({'success': True})
|
||||||
|
|
||||||
|
@action(detail=True, methods=['post'])
|
||||||
|
def restore_object(self, request, *args, **kwargs):
|
||||||
|
data = get_api_post_data(request)
|
||||||
|
if 'id' not in data:
|
||||||
|
raise ParseError('Missing id.')
|
||||||
|
|
||||||
|
restore_id = data['id']
|
||||||
|
if isinstance(restore_id, str) and restore_id.isdigit():
|
||||||
|
restore_id = int(restore_id)
|
||||||
|
|
||||||
|
if not isinstance(restore_id, int):
|
||||||
|
raise ParseError('id needs to be an integer.')
|
||||||
|
|
||||||
|
changeset = self.get_object()
|
||||||
|
with changeset.lock_to_edit(request) as changeset:
|
||||||
|
if not changeset.can_edit(request):
|
||||||
|
raise PermissionDenied(_('You can not edit changes on this change set.'))
|
||||||
|
|
||||||
|
try:
|
||||||
|
changed_object = changeset.changed_objects_set.get(pk=restore_id)
|
||||||
|
except Exception:
|
||||||
|
raise NotFound('could not find object.')
|
||||||
|
|
||||||
|
try:
|
||||||
|
changed_object.restore()
|
||||||
|
except PermissionError:
|
||||||
|
raise PermissionDenied(_('You cannot restore this object, because it depends on '
|
||||||
|
'a deleted object or it would violate a unique contraint.'))
|
||||||
|
|
||||||
|
return Response({'success': True})
|
||||||
|
|
||||||
@action(detail=True, methods=['post'])
|
@action(detail=True, methods=['post'])
|
||||||
def propose(self, request, *args, **kwargs):
|
def propose(self, request, *args, **kwargs):
|
||||||
if not request.user.is_authenticated:
|
if not request.user.is_authenticated:
|
||||||
|
|
|
@ -438,8 +438,9 @@ class ChangedObject(models.Model):
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
return OrderedDict((
|
return OrderedDict((
|
||||||
|
('pk', self.pk),
|
||||||
('type', self.model_class.__name__.lower()),
|
('type', self.model_class.__name__.lower()),
|
||||||
('pk', self.obj_pk),
|
('object_pk', self.obj_pk),
|
||||||
('is_created', self.is_created),
|
('is_created', self.is_created),
|
||||||
('deleted', self.deleted),
|
('deleted', self.deleted),
|
||||||
('updated_fields', self.updated_fields),
|
('updated_fields', self.updated_fields),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue