Skip to content

Commit

Permalink
Expando el criterio para el cálculo de "días desde la última actualiz…
Browse files Browse the repository at this point in the history
…ación del catálogo". Primero busca si hay una fecha de última actualización (modified) en el catálogo o en alguno de los datasets. Si no encuentra ninguna, busca una fecha de publicación (issued) en el catálogo o en el alguno de los datasets.
  • Loading branch information
abenassi committed Jul 11, 2017
1 parent 01d0c60 commit 3e5655a
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 19 deletions.
66 changes: 47 additions & 19 deletions pydatajson/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,9 @@ def _parse_date_string(date_string):
datetime: objeto fecha especificada por date_string.
"""

if not date_string:
return None

# La fecha cumple con la norma ISO 8601: YYYY-mm-ddThh-MM-ss.
# Nos interesa solo la parte de fecha, y no la hora. Se hace un
# split por la letra 'T' y nos quedamos con el primer elemento.
Expand All @@ -1045,6 +1048,41 @@ def _parse_date_string(date_string):
# Crea un objeto datetime a partir del formato especificado
return datetime.strptime(date_string, "%Y-%m-%d")

@classmethod
def _days_from_last_update(cls, catalog, date_field="modified"):
"""Calcula días desde la última actualización del catálogo.
Args:
catalog (dict): Un catálogo.
date_field (str): Campo de metadatos a utilizar para considerar
los días desde la última actualización del catálogo.
Returns:
int or None: Cantidad de días desde la última actualización del
catálogo o None, si no pudo ser calculada.
"""

# el "date_field" se busca primero a nivel catálogo, luego a nivel
# de cada dataset, y nos quedamos con el que sea más reciente
date_modified = catalog.get(date_field, None)
dias_ultima_actualizacion = None
# "date_field" a nivel de catálogo puede no ser obligatorio,
# si no está pasamos
if isinstance(date_modified, (unicode, str)):
date = cls._parse_date_string(date_modified)
dias_ultima_actualizacion = (datetime.now() - date).days

for dataset in catalog.get('dataset', []):
date = cls._parse_date_string(dataset.get(date_field, ""))
days_diff = float((datetime.now() - date).days) if date else None

# Actualizo el indicador de días de actualización si corresponde
if not dias_ultima_actualizacion or \
(days_diff and days_diff < dias_ultima_actualizacion):
dias_ultima_actualizacion = days_diff

return dias_ultima_actualizacion

def _generate_date_indicators(self, catalog, tolerance=0.2):
"""Genera indicadores relacionados a las fechas de publicación
y actualización del catálogo pasado por parámetro. La evaluación de si
Expand All @@ -1067,24 +1105,11 @@ def _generate_date_indicators(self, catalog, tolerance=0.2):
"""
result = {}

# Cálculo de días desde su última actualización.
# 'issued' se busca primero a nivel catálogo, luego a nivel dataset,
# y nos quedamos con el que sea más reciente
date_issued = catalog.get('issued', None)
dias_ultima_actualizacion = None
# 'issued' a nivel catálogo no es obligatorio, si no está pasamos
if isinstance(date_issued, (unicode, str)):
date = self._parse_date_string(date_issued)
dias_ultima_actualizacion = (datetime.now() - date).days

for dataset in catalog.get('dataset', []):
date = self._parse_date_string(dataset.get('issued', ""))
days_diff = float((datetime.now() - date).days)

# Actualizo el indicador de días de actualización si corresponde
if not dias_ultima_actualizacion or \
days_diff < dias_ultima_actualizacion:
dias_ultima_actualizacion = days_diff
dias_ultima_actualizacion = self._days_from_last_update(
catalog, "modified")
if not dias_ultima_actualizacion:
dias_ultima_actualizacion = self._days_from_last_update(
catalog, "issued")

result['catalogo_ultima_actualizacion_dias'] = \
dias_ultima_actualizacion
Expand Down Expand Up @@ -1260,7 +1285,10 @@ def dataset_is_updated(self, catalog, dataset):
if periodicity == 'eventual':
return True

date = self._parse_date_string(catalog_dataset['issued'])
if "modified" not in catalog_dataset:
return False

date = self._parse_date_string(catalog_dataset['modified'])
days_diff = float((datetime.now() - date).days)
interval = helpers.parse_repeating_time_interval(periodicity)

Expand Down
4 changes: 4 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -1021,5 +1021,9 @@ def test_dataset_is_updated(self):
dataset = "Declaración Jurada Patrimonial Integral de carácter público"
self.assertTrue(self.dj.dataset_is_updated(catalog, dataset))

def test_parse_date_string(self):
self.assertEqual(self.dj._parse_date_string(""), None)


if __name__ == '__main__':
nose.run(defaultTest=__name__)

0 comments on commit 3e5655a

Please sign in to comment.