Esempio n. 1
0
    def handle(self, request, collection_id=None, format_name=None):
        decoder = OpenSearch11BaseDecoder(request.GET)

        if collection_id:
            qs = models.Collection.objects.get(
                identifier=collection_id
            ).eo_objects.all()
        else:
            qs = models.Collection.objects.all()

        if decoder.search_terms:
            # TODO: search descriptions, summary etc once available
            qs = qs.filter(identifier__icontains=decoder.search_terms)

        namespaces = NameSpaceMap()
        all_parameters = {}
        for search_extension in self.search_extensions:
            # get all search extension related parameters and translate the name
            # to the actual parameter name
            params = dict(
                (parameter["type"], request.GET[parameter["name"]])
                for parameter in search_extension.get_schema()
                if parameter["name"] in request.GET
            )
            qs = search_extension.filter(qs, params)
            namespaces.add(search_extension.namespace)
            all_parameters[search_extension.namespace.prefix] = params

        total_count = len(qs)

        if decoder.start_index and not decoder.count:
            qs = qs[decoder.start_index:]
        elif decoder.start_index and decoder.count:
            qs = qs[decoder.start_index:decoder.start_index+decoder.count]
        elif decoder.count:
            qs = qs[:decoder.count]

        try:
            result_format = next(
                result_format
                for result_format in self.result_formats
                if result_format.name == format_name
            )
        except StopIteration:
            raise Http404("No such result format '%s'." % format_name)

        search_context = SearchContext(
            total_count, decoder.start_index, decoder.count, len(qs),
            all_parameters, namespaces
        )

        return (
            result_format.encode(request, collection_id, qs, search_context),
            result_format.mimetype
        )
Esempio n. 2
0
 def __init__(self, search_extensions):
     ns_os = NameSpace("http://a9.com/-/spec/opensearch/1.1/", None)
     self.ns_param = ns_param = NameSpace(
         "http://a9.com/-/spec/opensearch/extensions/parameters/1.0/",
         "parameters"
     )
     nsmap = NameSpaceMap(ns_os, ns_param)
     for search_extension in search_extensions:
         nsmap.add(search_extension.namespace)
     self.OS = ElementMaker(namespace=ns_os.uri, nsmap=nsmap)
     self.PARAM = ElementMaker(namespace=ns_param.uri, nsmap=nsmap)
     self.search_extensions = search_extensions
Esempio n. 3
0
 def __init__(self, search_extensions):
     ns_os = NameSpace("http://a9.com/-/spec/opensearch/1.1/", None)
     self.ns_param = ns_param = NameSpace(
         "http://a9.com/-/spec/opensearch/extensions/parameters/1.0/",
         "parameters")
     ns_atom = NameSpace("http://www.w3.org/2005/Atom", "atom")
     nsmap = NameSpaceMap(ns_os, ns_param, ns_atom)
     for search_extension in search_extensions:
         nsmap.add(search_extension.namespace)
     self.OS = ElementMaker(namespace=ns_os.uri, nsmap=nsmap)
     self.PARAM = ElementMaker(namespace=ns_param.uri, nsmap=nsmap)
     self.ATOM = ElementMaker(namespace=ns_atom.uri, nsmap=nsmap)
     self.search_extensions = search_extensions
Esempio n. 4
0
    def handle(self, request, collection_id=None, format_name=None):
        if request.method == "GET":
            request_parameters = request.GET
        elif request.method == "POST":
            request_parameters = request.POST
        else:
            raise Exception("Invalid request method '%s'." % request.method)

        decoder = OpenSearch11BaseDecoder(request_parameters)

        if collection_id:
            qs = models.Collection.objects.get(
                identifier=collection_id
            ).eo_objects.all()
        else:
            qs = models.Collection.objects.all()

        if decoder.search_terms:
            # TODO: search descriptions, summary etc once available
            qs = qs.filter(identifier__icontains=decoder.search_terms)

        namespaces = NameSpaceMap()
        all_parameters = {}
        for search_extension in self.search_extensions:
            # get all search extension related parameters and translate the name
            # to the actual parameter name
            params = dict(
                (parameter["type"], request_parameters[parameter["name"]])
                for parameter in search_extension.get_schema()
                if parameter["name"] in request_parameters
            )

            qs = search_extension.filter(qs, params)
            namespaces.add(search_extension.namespace)
            all_parameters[search_extension.namespace.prefix] = params

        total_count = len(qs)

        if decoder.start_index and not decoder.count:
            qs = qs[decoder.start_index:]
        elif decoder.start_index and decoder.count:
            qs = qs[decoder.start_index:decoder.start_index+decoder.count]
        elif decoder.count:
            qs = qs[:decoder.count]
        elif decoder.count == 0:
            if collection_id:
                qs = models.Collection.objects.none()
            else:
                qs = models.EOObject.objects.none()

        try:
            result_format = next(
                result_format
                for result_format in self.result_formats
                if result_format.name == format_name
            )
        except StopIteration:
            raise Http404("No such result format '%s'." % format_name)

        default_page_size = 100  # TODO: make this configurable

        search_context = SearchContext(
            total_count, decoder.start_index,
            decoder.count or default_page_size, len(qs),
            all_parameters, namespaces
        )

        return (
            result_format.encode(request, collection_id, qs, search_context),
            result_format.mimetype
        )
Esempio n. 5
0
    def handle(self, request, collection_id=None, format_name=None):
        if request.method == "GET":
            request_parameters = request.GET
        elif request.method == "POST":
            request_parameters = request.POST
        else:
            raise Exception("Invalid request method '%s'." % request.method)

        decoder = OpenSearch11BaseDecoder(request_parameters)

        if collection_id:
            # search for products in that collection and coverages not
            # associated with a product but contained in this collection

            ModelClass = get_opensearch_record_model()

            qs = ModelClass.objects.all()
            if ModelClass == models.EOObject:
                qs = qs.filter(
                    Q(product__collections__identifier=collection_id)
                    | Q(coverage__collections__identifier=collection_id,
                        coverage__parent_product__isnull=True)
                ).select_subclasses()
            else:
                qs = qs.filter(collections__identifier=collection_id)

        else:
            qs = models.Collection.objects.all()

        if decoder.search_terms:
            # TODO: search descriptions, summary etc once available
            qs = qs.filter(identifier__icontains=decoder.search_terms)

        namespaces = NameSpaceMap()
        all_parameters = {}
        for search_extension_class in get_extensions():
            # get all search extension related parameters and translate the name
            # to the actual parameter name
            search_extension = search_extension_class()

            params = dict(
                (parameter["type"], request_parameters[parameter["name"]])
                for parameter in search_extension.get_schema(
                    model_class=qs.model)
                if parameter["name"] in request_parameters)

            qs = search_extension.filter(qs, params)
            namespaces.add(search_extension.namespace)
            all_parameters[search_extension.namespace.prefix] = params

        if not qs.ordered:
            qs = qs.order_by('begin_time')

        # use [:] here, otherwise the queryset would be evaluated and return
        # lists upon slicing
        total_count = qs[:].count()

        # read the configuration and determine the count parameter
        conf = OpenSearchConfigReader(get_eoxserver_config())
        requested_count = min(
            decoder.count if decoder.count is not None else conf.default_count,
            conf.max_count)

        start_index = decoder.start_index

        # if count  is zero, then return an 'empty' queryset
        if requested_count == 0:
            qs = models.EOObject.objects.none()
        else:
            qs = qs[start_index:start_index + requested_count]

        result_count = qs[:].count()

        try:
            result_format = next(result_format()
                                 for result_format in get_formats()
                                 if result_format.name == format_name)
        except StopIteration:
            raise Http404("No such result format '%s'." % format_name)

        search_context = SearchContext(total_count, start_index,
                                       requested_count, result_count,
                                       all_parameters, namespaces)

        return (result_format.encode(request, collection_id, qs,
                                     search_context), result_format.mimetype)