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
Beispiel #2
0
 def save_ordering(self, request, *args, **kwargs):
     """ Сохранение порядка сортировки элементов """
     if request.user.has_perm('main.change_site', request.site):
         try:
             result = []
             for item in request.data:
                 section = Section.objects.filter(
                     Section.get_filter_query_by_site(request.site)
                     & Q(id=item['id'])).first()
                 if section:
                     if item['order'] or item['order'] == 0:
                         settings = section.get_settings(request.site,
                                                         cache=False)
                         if not settings:
                             settings = SectionSettings.objects.create(
                                 site=request.site,
                                 section=section,
                             )
                         settings.order = item['order']
                         settings.save()
                     result.append(section)
             return Response(
                 SectionSerializer(
                     result,
                     many=True,
                     context=self.get_serializer_context()).data)
         except:
             logger.error('Ошибка в отправляемых данных сортировки')
             logger.error(traceback.format_exc())
             raise serializers.ValidationError(
                 'Ошибка в отправляемых данных сортировки')
     else:
         raise PermissionDenied()
Beispiel #3
0
    def get_queryset(self):
        site = None
        query = Q()
        if self.request.GET.get('site'):
            try:
                site = Site.objects.get(id=self.request.GET.get('site'))
            except ObjectDoesNotExist:
                pass
        if site:
            query &= Section.get_filter_query_by_site(site)

        return super(SectionStaffView, self).get_queryset()\
            .filter(query)\
            .select_related('template')\
            .prefetch_related('sites')
Beispiel #4
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()