def hierarchy(self, request, *args, **kwargs) -> Response: """ Возвращает сериализованное дерево разделов """ site = self._get_current_site(self.request) # получение разделов первого уровня query = Q(level=0, is_deleted=False) if request.GET.get('code'): query = Q(code=request.GET.get('code')) items = self.get_queryset().filter(query) if request.GET.get('is_active') == 'true' and site: # фильтрация отключенных в админке разделов items = items.extra(**Section.get_extrafilter_active_by_site(site)) # получение всех разделов сайта для постороения иерархии query = Q(is_deleted=False) all_items = self.get_queryset().filter(query) if request.GET.get('is_active') == 'true' and site: # фильтрация отключенных в админке разделов all_items = all_items.extra( **Section.get_extrafilter_active_by_site(site)) serializer_context = self.get_serializer_context() serializer_context.update({'sections': list(all_items)}) return Response( SectionHierarchySerializer(items, many=True, context=serializer_context).data)
def get_children(self, obj: Section) -> typing.List[dict]: """ Возвращает потомков сериализованных потомком пункта меню """ result = [] if 'sections' in self.context: # получение дочерних разделов из контекста сверху children_items = list( filter(lambda i: i.parent_id == obj.id, self.context['sections'])) if len(children_items) > 0: result = SectionHierarchySerializer(children_items, many=True, context=self.context).data else: # получение дочерних разделов запросом в БД request = self.context.get('request') site = self._get_current_site(request) if request else None query = Q(is_deleted=False) & Section.get_filter_query_by_site( site if site else None) queryset = obj.get_children()\ .extra( **Section.get_extrafilter_ordering_by_site(site) )\ .filter(query)\ .prefetch_related('settings')\ .order_by('ordering', 'order')\ .distinct() # фильтрация отключенных разделов в адмикнке сайта if request and site and request.GET.get('is_active') == 'true': queryset = queryset.extra( **Section.get_extrafilter_active_by_site(site)) result = SectionHierarchySerializer(queryset, many=True, context=self.context).data return result