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