diff --git a/invenio/invenio.cfg b/invenio/invenio.cfg index a0ba8f5..465c390 100644 --- a/invenio/invenio.cfg +++ b/invenio/invenio.cfg @@ -39,7 +39,10 @@ from invenio_records_permissions.generators import ( SystemProcess, ) from invenio_records_resources.services.custom_fields import TextCF -from invenio_records_resources.services.records.facets.facets import TermsFacet +from invenio_records_resources.services.records.facets.facets import ( + LabelledFacetMixin, + TermsFacet, +) from invenio_records_resources.services.records.queryparser import ( FieldValueMapper, QueryParser, @@ -460,6 +463,62 @@ RDM_SORT_OPTIONS = { # value_labels={"true": _("Yes"), "false": _("No")}, # ) + +class DateHistogramFacet(LabelledFacetMixin, dsl.DateHistogramFacet): + """Date Range Facet + + facets = { + 'publication_date': DateRangeFacet( + field='dates', + interval='year', + format='yyyy' + ) + } + """ + + def __init__(self, *args, **kwargs): + """Show only years with at least 1 document.""" + kwargs.setdefault("min_doc_count", 1) + super().__init__(*args, **kwargs) + + def get_value_filter(self, filter_value): + """Overriding this function to cast string dates to datetime""" + + for interval_type in ("calendar_interval", "fixed_interval"): + if interval_type in self._params: + break + else: + interval_type = "interval" + + # dealing with a range + try: + if "--" in filter_value: + start, end = [ + datetime.strptime(year, "%Y") for year in filter_value.split("--") + ] + end = self.DATE_INTERVALS[self._params[interval_type]](end) + else: + start = datetime.strptime(filter_value, "%Y") + end = self.DATE_INTERVALS[self._params[interval_type]](start) + except ValueError: + start = 0 + end = 1 + + # swap them + if start > end: + start, end = end, start + + return dsl.query.Range( + _expand__to_dot=False, + **{ + self._params["field"]: { + "gte": start, + "lt": end, + } + }, + ) + + RDM_FACETS = { "access_status": { "facet": facets.access_status,