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
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()
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')
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()