Пример #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
Пример #2
0
    def get_queryset(self):
        site = self._get_current_site(self.request)

        query = Section.get_deleted_query(self.request.user)
        if site:
            query &= Section.get_filter_query_by_site(site)
        else:
            if not self.request.user.is_staff:
                query &= Q(id__isnull=True)
        return super(SectionView, self).get_queryset().filter(query)\
            .extra(
                **Section.get_extrafilter_ordering_by_site(site)
            )\
            .prefetch_related('settings')\
            .order_by('ordering', 'order')\
            .distinct()