Beispiel #1
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