def region_page( product_name: str = None, region_code: str = None, year: int = None, month: int = None, day: int = None, ): product, product_summary, selected_summary = _load_product( product_name, year, month, day) region_info = RegionInfo.for_product(product) if not region_info: abort(404, f"Product {product_name} has no region specification.") datasets = list( _model.STORE.find_datasets_for_region(product_name, region_code, year, month, day, limit=_HARD_SEARCH_LIMIT)) if len(datasets) == 1 and "feelinglucky" in flask.request.args: return flask.redirect( url_for("dataset.dataset_page", id_=datasets[0].id)) if request_wants_json(): return as_rich_json( dict(datasets=[ build_dataset_info(_model.STORE.index, d) for d in datasets ])) return utils.render( "region.html", year=year, month=month, day=day, region_code=region_code, product=product, product_region_info=region_info, # Summary for the whole product product_summary=product_summary, # Summary for the users' currently selected filters. selected_summary=selected_summary, datasets=datasets, result_limit=_HARD_SEARCH_LIMIT, )
def search_page(product_name: str = None, year: int = None, month: int = None, day: int = None): product, product_summary, selected_summary = _load_product( product_name, year, month, day) time_range = utils.as_time_range(year, month, day, tzinfo=_model.STORE.grouping_timezone) args = MultiDict(flask.request.args) query = utils.query_to_search(args, product=product) # Always add time range, selected product to query if product_name: query["product"] = product_name if "time" in query: # If they left one end of the range open, fill it in with the product bounds. search_time = query["time"] assert isinstance(search_time, Range) if product_summary: query["time"] = Range( search_time.begin or product_summary.time_earliest, search_time.end or product_summary.time_latest + timedelta(days=1), ) # The URL time range always trumps args. if time_range: query["time"] = time_range _LOG.info("query", query=query) # TODO: Add sort option to index API datasets = sorted( _model.STORE.index.datasets.search(**query, limit=_HARD_SEARCH_LIMIT), key=lambda d: d.center_time, ) if request_wants_json(): return as_rich_json( dict(datasets=[ build_dataset_info(_model.STORE.index, d) for d in datasets ])) # For display on the page (and future searches). if "time" not in query and product_summary: query["time"] = Range( product_summary.time_earliest, product_summary.time_latest + timedelta(days=1), ) return utils.render( "search.html", year=year, month=month, day=day, product=product, # Summary for the whole product product_summary=product_summary, # Summary for the users' currently selected filters. selected_summary=selected_summary, datasets=datasets, query_params=query, result_limit=_HARD_SEARCH_LIMIT, )
def region_page( product_name: str = None, region_code: str = None, year: int = None, month: int = None, day: int = None, ): ( product, product_summary, selected_summary, year_selector_summary, time_selector_summary, ) = _load_product(product_name, year, month, day) region_info = _model.STORE.get_product_region_info(product_name) if not region_info: abort(404, f"Product {product_name!r} has no region specification.") if region_info.region(region_code) is None: abort(404, f"Product {product_name!r} has no {region_code!r} region.") datasets = list( _model.STORE.find_datasets_for_region(product_name, region_code, year, month, day, limit=_HARD_SEARCH_LIMIT + 1)) more_datasets_exist = False if len(datasets) > _HARD_SEARCH_LIMIT: more_datasets_exist = True datasets = datasets[:_HARD_SEARCH_LIMIT] if len(datasets) == 1 and "feelinglucky" in flask.request.args: return flask.redirect( url_for("dataset.dataset_page", id_=datasets[0].id)) if request_wants_json(): return as_rich_json( dict(datasets=[ build_dataset_info(_model.STORE.index, d) for d in datasets ])) return utils.render( "region.html", year=year, month=month, day=day, region_code=region_code, product=product, product_region_info=region_info, # Summary for the whole product product_summary=product_summary, # Summary for the users' currently selected filters. selected_summary=selected_summary, datasets=datasets, there_are_more_results=more_datasets_exist, time_selector_summary=time_selector_summary, year_selector_summary=year_selector_summary, )
def region_page( product_name: str = None, region_code: str = None, year: int = None, month: int = None, day: int = None, ): ( product, product_summary, selected_summary, year_selector_summary, time_selector_summary, ) = _load_product(product_name, year, month, day) region_info = _model.STORE.get_product_region_info(product_name) if not region_info: abort(404, f"Product {product_name!r} has no region specification.") if region_info.region(region_code) is None: abort(404, f"Product {product_name!r} has no {region_code!r} region.") offset = flask.request.args.get("_o", default=0, type=int) limit = _HARD_SEARCH_LIMIT datasets = list( _model.STORE.find_datasets_for_region(product_name, region_code, year, month, day, limit=limit + 1, offset=offset)) def url_with_offset(new_offset: int): """Currently request url with a different offset.""" page_args = dict(flask.request.view_args) page_args["_o"] = new_offset return url_for(".region_page", **page_args) next_page_url = None if len(datasets) > limit: datasets = datasets[:limit] next_page_url = url_with_offset(offset + limit) previous_page_url = None if offset > 0: previous_page_url = url_with_offset(max(offset - _HARD_SEARCH_LIMIT, 0)) if len(datasets) == 1 and "feelinglucky" in flask.request.args: return flask.redirect( url_for("dataset.dataset_page", id_=datasets[0].id)) if request_wants_json(): return as_rich_json( dict(datasets=[ build_dataset_info(_model.STORE.index, d) for d in datasets ])) return utils.render( "region.html", year=year, month=month, day=day, region_code=region_code, product=product, product_region_info=region_info, # Summary for the whole product product_summary=product_summary, # Summary for the users' currently selected filters. selected_summary=selected_summary, datasets=datasets, previous_page_url=previous_page_url, next_page_url=next_page_url, time_selector_summary=time_selector_summary, year_selector_summary=year_selector_summary, )