def _get_map_results(query): q = extension.map_query(query) q = _filter_security(q, query.user, Map, 'view_map') if query.owner: q = q.filter(owner__username=query.owner) if query.extent: q = filter_by_extent(Map, q, query.extent) if query.added: q = q.filter(last_modified__gte=query.added) if query.period: q = filter_by_period(Map, q, *query.period) if query.kw: q = q.filter(_build_kw_only_query(query.kw)) if query.exclude: q = q.exclude(reduce(operator.or_, [Q(title__contains=ex) for ex in query.exclude])) if query.categories: q = _filter_category(q, query.categories) if query.query: q = _build_map_layer_text_query(q, query, query_keywords=True) rules = _rank_rules(ResourceBase, ['title',10, 5], ['abstract',5, 2], ) q = _safely_add_relevance(q, query, rules) return q.distinct()
def _get_map_results(query): q = extension.map_query(query) q = _filter_security(q, query.user, Map, 'view_map') if query.owner: q = q.filter(owner__username=query.owner) if query.extent: q = filter_by_extent(Map, q, query.extent) if query.added: q = q.filter(last_modified__gte=query.added) if query.period: q = filter_by_period(Map, q, *query.period) if query.kw: # this is a somewhat nested query but it performs way faster than # other approaches layers_with_kw = Layer.objects.filter(_build_kw_only_query(query.kw)).values('typename') map_layers_with = MapLayer.objects.filter(name__in=layers_with_kw).values('map') q = q.filter(id__in=map_layers_with) if query.query: q = _build_map_layer_text_query(q, query, query_keywords=True) rules = _rank_rules(Map, ['title',10, 5], ['abstract',5, 2], ) q = _safely_add_relevance(q, query, rules) return q.distinct()
def _get_layer_results(query): q = extension.layer_query(query) q = _filter_security(q, query.user, Layer, 'view_layer') if extension.exclude_patterns: name_filter = reduce( operator.or_, [Q(name__regex=f) for f in extension.exclude_patterns]) q = q.exclude(name_filter) if query.kw: q = q.filter(_build_kw_only_query(query.kw)) if query.exclude: q = q.exclude( reduce(operator.or_, [Q(title__contains=ex) for ex in query.exclude])) if query.owner: q = q.filter(owner__username=query.owner) if query.extent: q = filter_by_extent(Layer, q, query.extent) if query.added: q = q.filter(date__gte=query.added) if query.period: q = filter_by_period(Layer, q, *query.period) if query.categories: q = _filter_category(q, query.categories) # this is a special optimization for prefetching results when requesting # all records via search # keywords and thumbnails cannot be prefetched at the moment due to # the way the contenttypes are implemented if query.limit == 0 and using_geodjango: q = q.defer(None).prefetch_related("owner", "spatial_temporal_index") if query.query: q = _build_map_layer_text_query(q, query, query_keywords=True) |\ q.filter(name__icontains=query.query) # map doesn't have name rules = _rank_rules( ResourceBase, ['title', 10, 5], ['abstract', 5, 2], ) q = _safely_add_relevance(q, query, rules) return q.distinct()
def _get_owner_results(query): # make sure all contacts have a user attached q = extension.owner_query(query) if q is None: return None if query.kw: # hard to handle - not supporting at the moment return Profile.objects.none() if query.owner: q = q.filter(user__username__icontains=query.owner) if query.extent: q = filter_by_extent(Map, q, query.extent, True) | \ filter_by_extent(Layer, q, query.extent, True) if query.period: q = filter_by_period(Map, q, *query.period, user=True) | \ filter_by_period(Layer, q, *query.period, user=True) if query.added: q = q.filter(user__date_joined__gt=query.added) if query.query: qs = Q(user__username__icontains=query.query) | \ Q(user__first_name__icontains=query.query) | \ Q(user__last_name__icontains=query.query) for field in extension.owner_query_fields: qs = qs | Q(**{'%s__icontains' % field: query.query}) q = q.filter(qs) rules = _rank_rules(User,['username', 10, 5]) + \ _rank_rules(Profile,['organization', 5, 2]) added = extension.owner_rank_rules() if added: rules = rules + _rank_rules(*added) q = _safely_add_relevance(q, query, rules) return q.distinct()
def _get_owner_results(query): # make sure all contacts have a user attached q = extension.owner_query(query) if q is None: return None if query.kw: # hard to handle - not supporting at the moment return Profile.objects.none() if query.owner: q = q.filter(user__username__icontains = query.owner) if query.extent: q = filter_by_extent(Map, q, query.extent, True) | \ filter_by_extent(Layer, q, query.extent, True) if query.period: q = filter_by_period(Map, q, *query.period, user=True) | \ filter_by_period(Layer, q, *query.period, user=True) if query.added: q = q.filter(user__date_joined__gt = query.added) if query.query: qs = Q(user__username__icontains=query.query) | \ Q(user__first_name__icontains=query.query) | \ Q(user__last_name__icontains=query.query) for field in extension.owner_query_fields: qs = qs | Q(**{'%s__icontains' % field: query.query}) q = q.filter(qs) rules = _rank_rules(User,['username', 10, 5]) + \ _rank_rules(Profile,['organization', 5, 2]) added = extension.owner_rank_rules() if added: rules = rules + _rank_rules(*added) q = _safely_add_relevance(q, query, rules) return q.distinct()
def _get_layer_results(query): q = extension.layer_query(query) q = _filter_security(q, query.user, Layer, 'view_layer') if extension.exclude_patterns: name_filter = reduce(operator.or_,[ Q(name__regex=f) for f in extension.exclude_patterns]) q = q.exclude(name_filter) if query.kw: q = q.filter(_build_kw_only_query(query.kw)) if query.exclude: q = q.exclude(reduce(operator.or_, [Q(title__contains=ex) for ex in query.exclude])) if query.owner: q = q.filter(owner__username=query.owner) if query.extent: q = filter_by_extent(Layer, q, query.extent) if query.added: q = q.filter(date__gte=query.added) if query.period: q = filter_by_period(Layer, q, *query.period) if query.categories: q = _filter_category(q, query.categories) # this is a special optimization for prefetching results when requesting # all records via search # keywords and thumbnails cannot be prefetched at the moment due to # the way the contenttypes are implemented if query.limit == 0 and using_geodjango: q = q.defer(None).prefetch_related("owner","spatial_temporal_index") if query.query: q = _build_map_layer_text_query(q, query, query_keywords=True) |\ q.filter(name__icontains=query.query) # map doesn't have name rules = _rank_rules(Layer, ['name',10, 1], ['title',10, 5], ['abstract',5, 2], ) q = _safely_add_relevance(q, query, rules) return q.distinct()
def _get_document_results(query): q = extension.document_query(query) q = _filter_security(q, query.user, Document, "view_document") if extension.exclude_patterns: name_filter = reduce(operator.or_, [Q(name__regex=f) for f in extension.exclude_patterns]) q = q.exclude(name_filter) if query.kw: q = q.filter(_build_kw_only_query(query.kw)) if query.owner: q = q.filter(owner__username=query.owner) if query.type and query.type != "document": q = q.filter(storeType=query.type) if query.extent: q = filter_by_extent(Document, q, query.extent) if query.added: q = q.filter(date__gte=query.added) if query.period: q = filter_by_period(Layer, q, *query.period) # this is a special optimization for prefetching results when requesting # all records via search # keywords and thumbnails cannot be prefetched at the moment due to # the way the contenttypes are implemented if query.limit == 0 and using_geodjango: q = q.defer(None).prefetch_related("owner", "spatial_temporal_index") if query.query: q = _build_map_layer_text_query(q, query, query_keywords=True) rules = _rank_rules(Document, ["title", 10, 5], ["abstract", 5, 2]) q = _safely_add_relevance(q, query, rules) return q.distinct()