Ejemplo n.º 1
0
def _build_entity_queryset(user, model, list_view_state, extra_q,
                           entity_filter, header_filter):
    filtered = False
    use_distinct = False
    queryset = model.objects.filter(is_deleted=False)

    if entity_filter:
        filtered = True
        queryset = entity_filter.filter(queryset)

    if extra_q:
        try:
            queryset = queryset.filter(extra_q)
        except Exception as e:
            logger.exception(
                'Error when building the search queryset: invalid q_filter (%s).',
                e)
        else:
            filtered = True
            use_distinct = True

    list_view_state.extra_q = extra_q  # TODO: only if valid ?

    # TODO: method in ListViewState that returns the improved queryset
    lv_state_q = list_view_state.get_q_with_research(model,
                                                     header_filter.cells)
    try:
        queryset = queryset.filter(lv_state_q)
    except Exception as e:
        logger.exception(
            'Error when building the search queryset with Q=%s (%s).',
            lv_state_q, e)
    else:
        if lv_state_q:
            filtered = True
            use_distinct = True

    queryset = EntityCredentials.filter(user, queryset)

    if use_distinct:
        queryset = queryset.distinct()

    # If the query does not use the real entities' specific fields to filter,
    # we perform a query on CremeEntity & so we avoid a JOIN.
    count = queryset.count() if filtered else \
            EntityCredentials.filter_entities(
                    user,
                    CremeEntity.objects.filter(
                         is_deleted=False,
                         entity_type=ContentType.objects.get_for_model(model),
                        ),
                    as_model=model,
                ).count()

    return queryset, count
Ejemplo n.º 2
0
    def get_unordered_queryset_n_count(self):
        # Cannot use this because it use get_ordering() too early
        # qs = super().get_queryset().filter(is_deleted=False)
        qs = self.model._default_manager.filter(is_deleted=False)
        state = self.state

        filtered = False
        use_distinct = False

        # ----
        entity_filter = self.entity_filter

        if entity_filter:
            filtered = True
            qs = entity_filter.filter(qs)

        # ----
        extra_q = self.extra_q['total']

        if extra_q:
            try:
                qs = qs.filter(extra_q)
            except Exception as e:
                logger.exception(
                    'Error when building the search queryset: invalid q_filter (%s).',
                    e)
            else:
                filtered = True
                use_distinct = True

        state.extra_q = extra_q  # TODO: only if valid ? no write in state HERE ?

        # ----
        # lv_state_q = state.get_q_with_research(self.model, self.cells)
        # try:
        #     qs = qs.filter(lv_state_q)
        # except Exception as e:
        #     logger.exception('Error when building the search queryset with Q=%s (%s).', lv_state_q, e)
        # else:
        #     if lv_state_q:
        #         filtered = True
        #         use_distinct = True
        search_q = self.search_form.search_q
        if search_q:
            try:
                qs = qs.filter(search_q)
            except Exception as e:
                logger.exception(
                    'Error when building the search queryset with Q=%s (%s).',
                    search_q, e)
            else:
                filtered = True
                use_distinct = True

        # ----
        user = self.request.user
        qs = EntityCredentials.filter(user, qs)

        if use_distinct:
            qs = qs.distinct()

        # ----
        # If the query does not use the real entities' specific fields to filter,
        # we perform a query on CremeEntity & so we avoid a JOIN.
        if filtered:
            count = qs.count()
        else:
            model = self.model
            try:
                count = EntityCredentials.filter_entities(
                    user,
                    CremeEntity.objects.filter(
                        is_deleted=False,
                        entity_type=ContentType.objects.get_for_model(model),
                    ),
                    as_model=model,
                ).count()
            except EntityCredentials.FilteringError as e:
                logger.debug(
                    '%s.get_unordered_queryset_n_count() : fast count is not possible (%s)',
                    type(self).__name__,
                    e,
                )
                count = qs.count()

        return qs, count