From 948270bbcbf09eeeee67a419e712eb2d507d6114 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 7 Dec 2021 23:54:45 +0100 Subject: [PATCH] add stuff to mark starting endpoint --- InvenTree/part/api.py | 21 ++++++++++++++++++--- InvenTree/part/serializers.py | 8 ++++++++ InvenTree/templates/js/dynamic/nav.js | 8 +++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index fbd2ad939b..079e0dbe81 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -255,14 +255,28 @@ class CategoryTree(generics.ListAPIView): cat_id = params.get('id', None) if cat_id in (None, '', '#', ): - queryset = queryset.filter(parent=None) + filter_kwargs = {} + # get whole tree + if 'ref_type' in self.kwargs and 'ref' in self.kwargs: + if 'part' in self.kwargs['ref_type']: + filter_kwargs['parts__id'] = self.kwargs['ref'] + elif 'category' in self.kwargs['ref_type']: + filter_kwargs['id'] = self.kwargs['ref'] + else: + filter_kwargs['id'] = None + branch = queryset.model.objects.filter(**filter_kwargs).get_ancestors(include_self=True) + queryset = queryset.filter(parent=None) | branch + self.kwargs['ancestors'] = branch else: queryset = queryset.filter(parent_id=cat_id) return queryset - def get(self, request, *args, **kwargs): - return super().get(request, *args, **kwargs) + def get_serializer_context(self): + context = super().get_serializer_context() + if 'ancestors' in self.kwargs: + context['ancestors'] = self.kwargs['ancestors'] + return context class PartSalePriceList(generics.ListCreateAPIView): @@ -1541,6 +1555,7 @@ part_api_urls = [ # Base URL for PartCategory API endpoints url(r'^category/', include([ + url(r'^tree/(?P[-\w]+)/(?P\d+)/', CategoryTree.as_view(), name='api-part-category-root-tree'), url(r'^tree/', CategoryTree.as_view(), name='api-part-category-tree'), url(r'^parameters/', CategoryParameterList.as_view(), name='api-part-category-parameter-list'), diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 7d15f7c4e6..eb274f70af 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -83,6 +83,8 @@ class CategoryTree(InvenTreeModelSerializer): a_attr = serializers.SerializerMethodField() + state = serializers.SerializerMethodField() + def get_parent(self, obj): return obj.parent.pk if obj.parent else '#' @@ -92,6 +94,11 @@ class CategoryTree(InvenTreeModelSerializer): def get_a_attr(self, obj): return {'href': obj.get_absolute_url()} + def get_state(self, obj): + if 'ancestors' in self.context: + return {'opened': obj in self.context['ancestors'] } + return {} + class Meta: model = PartCategory fields = [ @@ -100,6 +107,7 @@ class CategoryTree(InvenTreeModelSerializer): 'parent', 'children', 'a_attr', + 'state', ] diff --git a/InvenTree/templates/js/dynamic/nav.js b/InvenTree/templates/js/dynamic/nav.js index 68ea3979d1..5577e60d3a 100644 --- a/InvenTree/templates/js/dynamic/nav.js +++ b/InvenTree/templates/js/dynamic/nav.js @@ -153,7 +153,13 @@ function enableSidetree(label) { $('#tree').jstree({ 'core': { 'data': { - 'url': '/api/part/category/tree/', + 'url': function(node) { + if (node.id == '#') { + var url_parts = String(window.location).split("/").slice(-3); + return `/api/part/category/tree/${url_parts[0]}/${url_parts[1]}/`; + } + return '/api/part/category/tree/' + }, 'data': function(node) { return {'id': node.id}; }