Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
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()
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
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()
Exemplo n.º 7
0
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()
Exemplo n.º 8
0
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()