Added check for hierarchical loops in agenda sort view. See #2972.

This commit is contained in:
Norman Jäckel 2017-02-17 17:20:13 +01:00
parent 9a1e45682c
commit aa14ac99b3

View File

@ -241,7 +241,8 @@ class ItemViewSet(ListModelMixin, RetrieveModelMixin, UpdateModelMixin, GenericV
@list_route(methods=['post']) @list_route(methods=['post'])
def sort(self, request): def sort(self, request):
""" """
Sort agenda items. Sort agenda items. Also checks parent field to prevent hierarchical
loops.
""" """
nodes = request.data.get('nodes', []) nodes = request.data.get('nodes', [])
parent_id = request.data.get('parent_id') parent_id = request.data.get('parent_id')
@ -253,5 +254,15 @@ class ItemViewSet(ListModelMixin, RetrieveModelMixin, UpdateModelMixin, GenericV
item.weight = index item.weight = index
item.save(skip_autoupdate=True) item.save(skip_autoupdate=True)
items.append(item) items.append(item)
# Now check consistency. TODO: Try to use less DB queries.
item = Item.objects.get(pk=node['id'])
ancestor = item.parent
while ancestor is not None:
if ancestor == item:
raise ValidationError({'detail': _(
'There must not be a hierarchical loop. Please reload the page.')})
ancestor = ancestor.parent
inform_changed_data(items) inform_changed_data(items)
return Response({'detail': _('The agenda has been sorted.')}) return Response({'detail': _('The agenda has been sorted.')})