Skip to content

Commit

Permalink
Merge pull request #125 from datosgobar/90-mover-superTheme-a-theme
Browse files Browse the repository at this point in the history
90 mover super theme a theme
  • Loading branch information
poligarcia committed Mar 12, 2018
2 parents 3c42835 + 9dd9531 commit c71794d
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 14 deletions.
3 changes: 3 additions & 0 deletions docs/MANUAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,11 @@ Toma los siguientes parámetros:
- **portal_url**: URL del portal de CKAN de destino.
- **apikey**: La apikey de un usuario del portal de destino con los permisos para crear el dataset bajo la
organización pasada como parámetro.
- **demote_superThemes** (opcional, default: True):Si está en true, los ids de los themes del dataset, se escriben
como groups de CKAN.
- **demote_themes** (opcional, default: True): Si está en true, los labels de los themes del dataset, se escriben como
tags de CKAN; sino,se pasan como grupo.


Retorna el id en el nodo de destino del dataset federado.

Expand Down
10 changes: 7 additions & 3 deletions pydatajson/ckan_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ def append_attribute_to_extra(package, dataset, attribute, serialize=False):
package['extras'].append({'key': attribute, 'value': value})


def map_dataset_to_package(dataset, catalog_id, owner_org, theme_taxonomy, demote_themes=True):
def map_dataset_to_package(dataset, catalog_id, owner_org, theme_taxonomy,
demote_superThemes=True, demote_themes=True):
package = dict()
package['extras'] = []
# Obligatorios
Expand All @@ -33,8 +34,10 @@ def map_dataset_to_package(dataset, catalog_id, owner_org, theme_taxonomy, demot
package['resources'] = map_distributions_to_resources(distributions, catalog_id)

super_themes = dataset['superTheme']
package['groups'] = [{'name': title_to_name(super_theme, decode=False)} for super_theme in super_themes]
append_attribute_to_extra(package, dataset, 'superTheme', serialize=True)
if demote_superThemes:
package['groups'] = [{'name': title_to_name(super_theme, decode=False)} for super_theme in super_themes]


# Recomendados y opcionales
package['url'] = dataset.get('landingPage')
Expand Down Expand Up @@ -66,7 +69,8 @@ def map_dataset_to_package(dataset, catalog_id, owner_org, theme_taxonomy, demot
label = next(x['label'] for x in theme_taxonomy if x['id'] == theme)
package['tags'].append({'name': label})
else:
package['groups'] += [{'name': title_to_name(theme, decode=False)} for theme in themes]
package['groups'] = package.get('groups', []) + [{'name': title_to_name(theme, decode=False)}
for theme in themes]

return package

Expand Down
6 changes: 4 additions & 2 deletions pydatajson/federation.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


def push_dataset_to_ckan(catalog, catalog_id, owner_org, dataset_origin_identifier, portal_url, apikey,
demote_themes=True):
demote_superThemes=True, demote_themes=True):
"""Escribe la metadata de un dataset en el portal pasado por parámetro.
Args:
Expand All @@ -20,6 +20,7 @@ def push_dataset_to_ckan(catalog, catalog_id, owner_org, dataset_origin_identifi
dataset_origin_identifier (str): El id del dataset que se va a federar.
portal_url (str): La URL del portal CKAN de destino.
apikey (str): La apikey de un usuario con los permisos que le permitan crear o actualizar el dataset.
demote_superThemes(bool): Si está en true, los ids de los super themes del dataset, se propagan como grupo.
demote_themes(bool): Si está en true, los labels de los themes del dataset, pasan a ser tags. Sino,
se pasan como grupo.
Expand All @@ -30,7 +31,8 @@ def push_dataset_to_ckan(catalog, catalog_id, owner_org, dataset_origin_identifi
ckan_portal = RemoteCKAN(portal_url, apikey=apikey)
theme_taxonomy = catalog.themes

package = map_dataset_to_package(dataset, catalog_id, owner_org, theme_taxonomy, demote_themes=demote_themes)
package = map_dataset_to_package(dataset, catalog_id, owner_org, theme_taxonomy,
demote_superThemes, demote_themes)

# Get license id
if dataset.get('license'):
Expand Down
49 changes: 40 additions & 9 deletions tests/test_ckan_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ def test_dataset_array_attributes_are_correct(self):
self.assertCountEqual(keywords + theme_labels, tags)

def test_themes_are_preserved_if_not_demoted(self):
package = map_dataset_to_package(self.dataset, self.catalog_id, 'owner', self.catalog.themes,
demote_themes=False)
package = map_dataset_to_package(self.dataset, self.catalog_id, 'owner',
self.catalog.themes, demote_themes=False)
groups = [group['name'] for group in package.get('groups', [])]
super_themes = [title_to_name(s_theme.lower()) for s_theme in self.dataset.get('superTheme')]
themes = self.dataset.get('theme', [])
Expand All @@ -84,15 +84,48 @@ def test_themes_are_preserved_if_not_demoted(self):
except AttributeError:
self.assertCountEqual(keywords, tags)

def test_superThemes_dont_impact_groups_if_not_demoted(self):
package = map_dataset_to_package(self.dataset, self.catalog_id, 'owner',
self.catalog.themes, demote_superThemes=False)
groups = [group['name'] for group in package.get('groups', [])]
tags = [tag['name'] for tag in package['tags']]
keywords = self.dataset.get('keyword', [])
themes = self.dataset.get('theme', [])
theme_labels = []
for theme in themes:
label = next(x['label'] for x in self.catalog.themes if x['id'] == theme)
theme_labels.append(label)
try:
self.assertItemsEqual([], groups)
except AttributeError:
self.assertCountEqual([], groups)
try:
self.assertItemsEqual(keywords + theme_labels, tags)
except AttributeError:
self.assertCountEqual(keywords + theme_labels, tags)

def test_preserve_themes_and_superThemes(self):
package = map_dataset_to_package(self.dataset, self.catalog_id, 'owner',
self.catalog.themes, False, False)
groups = [group['name'] for group in package.get('groups', [])]
tags = [tag['name'] for tag in package['tags']]
keywords = self.dataset.get('keyword', [])
themes = self.dataset.get('theme', [])
try:
self.assertItemsEqual(themes, groups)
except AttributeError:
self.assertCountEqual(themes, groups)
try:
self.assertItemsEqual(keywords, tags)
except AttributeError:
self.assertCountEqual(keywords, tags)

def test_dataset_extra_attributes_are_correct(self):
package = map_dataset_to_package(self.dataset, self.catalog_id, 'owner', self.catalog.themes)
# extras are included in dataset
if package['extras']:
for extra in package['extras']:
if extra['key'] == 'super_theme':
dataset_value = self.dataset['superTheme']
else:
dataset_value = self.dataset[extra['key']]
dataset_value = self.dataset[extra['key']]
if type(dataset_value) is list:
extra_value = json.loads(extra['value'])
try:
Expand All @@ -106,7 +139,7 @@ def test_dataset_extra_attributes_are_correct(self):
def test_dataset_extra_attributes_are_complete(self):
package = map_dataset_to_package(self.dataset, self.catalog_id, 'owner', self.catalog.themes)
# dataset attributes are included in extras
extra_attrs = ['issued', 'modified', 'accrualPeriodicity', 'temporal', 'language', 'spatial']
extra_attrs = ['issued', 'modified', 'accrualPeriodicity', 'temporal', 'language', 'spatial', 'superTheme']
for key in extra_attrs:
value = self.dataset.get(key)
if value:
Expand All @@ -115,8 +148,6 @@ def test_dataset_extra_attributes_are_complete(self):
resulting_dict = {'key': key, 'value': value}
self.assertTrue(resulting_dict in package['extras'])

self.assertTrue({'key': 'super_theme', 'value': json.dumps(self.dataset['superTheme'])})

def test_resources_replicated_attributes_stay_the_same(self):
resources = map_distributions_to_resources(self.distributions, self.catalog_id+'_'+self.dataset_id)
for resource in resources:
Expand Down

0 comments on commit c71794d

Please sign in to comment.