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
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