示例#1
0
文件: stac.py 项目: saiplanner/eodag
    def __update_data_from_catalog_config(self, catalog_config):
        """Updates configuration and data using given input catalog config

        :param catalog_config: catalog config, from yml stac_config[catalogs]
        :type catalog_config: dict
        """
        model = catalog_config["model"]

        self.catalog_config = update_nested_dict(self.catalog_config,
                                                 catalog_config)

        # parse f-strings
        # defaultdict usage will return "" for missing keys in format_args
        format_args = copy.deepcopy(self.stac_config)
        format_args["catalog"] = defaultdict(
            str, dict(model, **{
                "root": self.root,
                "url": self.url
            }))
        parsed_model = format_dict_items(self.catalog_config["model"],
                                         **format_args)

        self.update_data(parsed_model)

        return True
示例#2
0
 def get_queryables(self, search_params):
     """Retrieve the metadata mappings that are query-able"""
     logger.debug("Retrieving queryable metadata from metadata_mapping")
     queryables = {}
     for eodag_search_key, user_input in search_params.items():
         if user_input is not None:
             md_mapping = self.config.metadata_mapping.get(
                 eodag_search_key, (None, NOT_MAPPED))
             _, md_value = md_mapping
             # query param from defined metadata_mapping
             if md_mapping is not None and isinstance(md_mapping, list):
                 search_param = get_search_param(md_mapping)
                 if search_param is not None:
                     queryables[eodag_search_key] = search_param
             # query param from metadata auto discovery
             elif md_value == NOT_MAPPED and getattr(
                     self.config, "discover_metadata", {}).get(
                         "auto_discovery", False):
                 pattern = re.compile(
                     self.config.discover_metadata.get(
                         "metadata_pattern", ""))
                 search_param_cfg = self.config.discover_metadata.get(
                     "search_param", "")
                 if pattern.match(eodag_search_key) and isinstance(
                         search_param_cfg, str):
                     search_param = search_param_cfg.format(
                         metadata=eodag_search_key)
                     queryables[eodag_search_key] = search_param
                 elif pattern.match(eodag_search_key) and isinstance(
                         search_param_cfg, dict):
                     search_param_cfg_parsed = dict_items_recursive_apply(
                         search_param_cfg,
                         lambda k, v: v.format(metadata=eodag_search_key),
                     )
                     for k, v in search_param_cfg_parsed.items():
                         if getattr(self.config, k, None):
                             update_nested_dict(getattr(self.config, k),
                                                v,
                                                extend_list_values=True)
                         else:
                             logger.warning(
                                 "Could not use discover_metadata[search_param]: no entry for %s in plugin config",
                                 k,
                             )
     return queryables
示例#3
0
    def build_query_string(self, *args, **kwargs):
        """Build The query string using the search parameters"""
        logger.debug("Building the query string that will be used for search")

        if "raise_errors" in kwargs.keys():
            del kwargs["raise_errors"]
        # . not allowed in eodag_search_key, replaced with %2E
        kwargs = {k.replace(".", "%2E"): v for k, v in kwargs.items()}

        queryables = self.get_queryables(kwargs)
        query_params = {}
        # Get all the search parameters that are recognised as queryables by the
        # provider (they appear in the queryables dictionary)

        for eodag_search_key, provider_search_key in queryables.items():
            user_input = kwargs[eodag_search_key]

            if self.COMPLEX_QS_REGEX.match(provider_search_key):
                parts = provider_search_key.split("=")
                if len(parts) == 1:
                    formatted_query_param = format_metadata(
                        provider_search_key, *args, **kwargs
                    )
                    if "{{" in provider_search_key:
                        # json query string (for POST request)
                        update_nested_dict(
                            query_params, json.loads(formatted_query_param)
                        )
                    else:
                        query_params[eodag_search_key] = formatted_query_param
                else:
                    provider_search_key, provider_value = parts
                    query_params.setdefault(provider_search_key, []).append(
                        format_metadata(provider_value, *args, **kwargs)
                    )
            else:
                query_params[provider_search_key] = user_input

        # Now get all the literal search params (i.e params to be passed "as is"
        # in the search request)
        # ignore additional_params if it isn't a dictionary
        literal_search_params = getattr(self.config, "literal_search_params", {})
        if not isinstance(literal_search_params, dict):
            literal_search_params = {}

        # Now add formatted free text search parameters (this is for cases where a
        # complex query through a free text search parameter is available for the
        # provider and needed for the consumer)
        literal_search_params.update(self.format_free_text_search(**kwargs))
        for provider_search_key, provider_value in literal_search_params.items():
            if isinstance(provider_value, list):
                query_params.setdefault(provider_search_key, []).extend(provider_value)
            else:
                query_params.setdefault(provider_search_key, []).append(provider_value)

        # Build the final query string, in one go without quoting it
        # (some providers do not operate well with urlencoded and quoted query strings)
        return (
            query_params,
            urlencode(
                query_params, doseq=True, quote_via=lambda x, *_args, **_kwargs: x
            ),
        )