示例#1
0
    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)
示例#2
0
    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