basedosdados / website

🖥 Website oficial da BD
http://basedosdados.org
24 stars 7 forks source link

[develop] Alguns entrypoints da API retornam erros mesmo com `data_dict` idêntico ao JSON do `package_show` #85

Closed vmussa closed 3 years ago

vmussa commented 3 years ago

Descrição do bug

Ao enviar um data_dict idêntico ao JSON retornado pelo package_show (id=br-ibge-pib) para o package_validate, recebo o seguinte erro no cliente do Python:

CKANAPIError: ['http://0.0.0.0:5000/api/action/package_validate', 500, '{"help": "http://3.87.150.32/api/3/action/help_show?name=package_validate", "error": {"__type": "Internal Server Error", "message": "Internal Server Error"}, "success": false}']

E no log servidor web do website eu recebo o seguinte erro:

2021-09-06 22:03:56,451 ERROR [ckan.views.api] dict() got multiple values for keyword argument 'dataset_id'
Traceback (most recent call last):
  File "/venv/lib/python3.9/site-packages/ckan/config/middleware/../../views/api.py", line 291, in action
    result = function(context, request_data)
             │        │        └ {'name': 'br-ibge-pib_', 'title': 'Produto Interno Bruto do Brasil', 'type': 'dataset', 'notes': 'Um sistema de indicadores muni...
             │        └ {'model': <module 'ckan.model' from '/venv/lib/python3.9/site-packages/ckan/model/__init__.py'>, 'session': <sqlalchemy.orm.scop...
             └ <function get_action.<locals>.make_wrapped.<locals>.wrapped at 0x7f77d48e7c10>
  File "/venv/lib/python3.9/site-packages/ckan/logic/__init__.py", line 473, in wrapped
    result = _action(context, data_dict, **kw)
             │       │        │            └ {}
             │       │        └ {'name': 'br-ibge-pib_', 'title': 'Produto Interno Bruto do Brasil', 'type': 'dataset', 'notes': 'Um sistema de indicadores muni...
             │       └ {'model': <module 'ckan.model' from '/venv/lib/python3.9/site-packages/ckan/model/__init__.py'>, 'session': <sqlalchemy.orm.scop...
             └ <function package_validate at 0x7f77d4312d30>
  File "/app/ckanext-basedosdados/ckanext/basedosdados/actions/__init__.py", line 36, in package_validate
    data, errors = lib_plugins.plugin_validate(
  File "/venv/lib/python3.9/site-packages/ckan/lib/plugins.py", line 302, in plugin_validate
    result = plugin.validate(context, data_dict, schema, action)
             │               │        │          │       └ 'package_create'
             │               │        │          └ {'__before': [<function duplicate_extras_key at 0x7f77d79d7700>, <function ignore at 0x7f77d48c7dc0>], 'id': [<function empty_if...
             │               │        └ {'name': 'br-ibge-pib_', 'title': 'Produto Interno Bruto do Brasil', 'type': 'dataset', 'notes': 'Um sistema de indicadores muni...
             │               └ {'model': <module 'ckan.model' from '/venv/lib/python3.9/site-packages/ckan/model/__init__.py'>, 'session': <sqlalchemy.orm.scop...
             └ <Plugin BasedosdadosPlugin 'basedosdados'>
  File "/app/ckanext-basedosdados/ckanext/basedosdados/plugin.py", line 28, in validate
    out, errors = {
  File "/app/ckanext-basedosdados/ckanext/basedosdados/plugin.py", line 58, in _validate_create
    out = self._validate_pydantic(data_dict, action)
          │                       │          └ 'package_create'
          │                       └ {'name': 'br-ibge-pib_', 'title': 'Produto Interno Bruto do Brasil', 'type': 'dataset', 'notes': 'Um sistema de indicadores muni...
          └ <Plugin BasedosdadosPlugin 'basedosdados'>
  File "/app/ckanext-basedosdados/ckanext/basedosdados/plugin.py", line 106, in _validate_pydantic
    data_model = dict(**data_dict, **dataset_args)
                        │            └ {'dataset_id': 'br_ibge_pib'}
                        └ {'name': 'br-ibge-pib_', 'title': 'Produto Interno Bruto do Brasil', 'type': 'dataset', 'notes': 'Um sistema de indicadores muni...
TypeError: dict() got multiple values for keyword argument 'dataset_id'

Os mesmos errors acontecem no cliente Python e no servidor web ao tentar publicar modificações dos metadados via package_patch.

O data_dict passo para API do CKAN é o seguinte:

{'id': '9ffa2eb2-3119-45f1-9353-7c279f1613e9',
 'name': 'br-ibge-pib',
 'title': 'Produto Interno Bruto do Brasil',
 'type': 'dataset',
 'notes': 'Um sistema de indicadores municipais com informações econômicas e sociais é importante instrumento para o planejamento de políticas públicas. Com a promulgação da Constituição Federal de 1988, que deu mais responsabilidade e autonomia aos municípios, ampliaram-se as demandas por informações econômicas padronizadas e comparáveis em nível municipal, tanto por parte de agentes públicos e privados, quanto por estudiosos da economia, e pela sociedade em geral. os resultados do PIB dos Municípios permitem identificar as áreas de geração de renda, produzindo informações que captam as especifidades do País.Dados sobre Produto Interno Bruto do IBGE.\nDados sobre Produto Interno Bruto do IBGE.\n',
 'author': None,
 'author_email': None,
 'maintainer': None,
 'maintainer_email': None,
 'state': 'active',
 'license_id': '',
 'url': 'https://sidra.ibge.gov.br/pesquisa/pib-munic',
 'version': None,
 'metadata_created': '2019-09-17T17:05:24.772484',
 'metadata_modified': '2021-08-17T04:01:25.334011',
 'creator_user_id': '27eaffe3-f79b-469f-8f02-4716146bdfcc',
 'private': False,
 'license_title': '',
 'num_resources': 3,
 'resources': [{'id': '2fa7cf39-5a8c-4e9f-87d1-297f85c98371',
   'name': 'Baixar (Link Externo)',
   'description': '',
   'position': 0,
   'url': 'https://sidra.ibge.gov.br/pesquisa/pib-munic/tabelas',
   'cache_last_updated': None,
   'cache_url': None,
   'created': '2019-09-17T17:05:51.164381',
   'datastore_active': False,
   'format': '',
   'hash': '',
   'last_modified': None,
   'metadata_modified': '2021-08-11T01:23:07.893966',
   'mimetype': None,
   'mimetype_inner': None,
   'package_id': '9ffa2eb2-3119-45f1-9353-7c279f1613e9',
   'size': None,
   'state': 'active',
   'url_type': None,
   'resource_type': 'external_link',
   'language': ['portuguese'],
   'has_structured_data': None,
   'has_api': None,
   'is_free': 'yes',
   'requires_registration': 'no',
   'country_ip_address_required': None,
   'license': 'mit',
   'temporal_coverage': [2002,
    2003,
    2004,
    2005,
    2006,
    2007,
    2008,
    2009,
    2010,
    2011,
    2012,
    2013,
    2014,
    2015,
    2016,
    2017],
   'update_frequency': 'one_year',
   'formato': ''},
  {'id': '29f1c4e5-5932-4a6b-8b1f-f8b0bd91a200',
   'name': 'municipio',
   'description': 'Produto Interno Bruto (PIB) municipal a preços correntes.\n',
   'position': 1,
   'url': '',
   'cache_last_updated': None,
   'cache_url': None,
   'created': '2020-10-13T18:32:26.189478',
   'datastore_active': False,
   'format': '',
   'hash': '',
   'last_modified': None,
   'metadata_modified': '2021-08-17T04:01:25.346852',
   'mimetype': None,
   'mimetype_inner': None,
   'package_id': '9ffa2eb2-3119-45f1-9353-7c279f1613e9',
   'size': None,
   'state': 'active',
   'url_type': '',
   'resource_type': 'bdm_table',
   'dataset_id': 'br_ibge_pib',
   'table_id': 'municipio',
   'spatial_coverage': 'bra',
   'temporal_coverage': [2002,
    2003,
    2004,
    2005,
    2006,
    2007,
    2008,
    2009,
    2010,
    2011,
    2012,
    2013,
    2014,
    2015,
    2016,
    2017,
    2018],
   'update_frequency': 'one_year',
   'entity': ['municipality'],
   'identifying_columns': ['id_municipio', 'ano'],
   'version': 'v1.0',
   'published_by': {'name': 'Ricardo Dahis',
    'email': 'rdahis@basedosdados.org',
    'github_user': None,
    'website': 'www.ricardodahis.com',
    'ckan_user': None},
   'data_cleaned_by': {'name': 'Ricardo Dahis',
    'email': 'rdahis@basedosdados.org',
    'github_user': None,
    'ckan_user': None,
    'website': None,
    'code_url': 'https://github.com/basedosdados/mais/tree/master/bases/br_ibge_pib/code'},
   'data_cleaning_description': 'Mudamos a unidade de medida para R$1.\n',
   'auxiliary_files_url': '',
   'source_bucket_name': 'basedosdados-dev',
   'project_id_prod': 'basedosdados-dev',
   'project_id_staging': 'basedosdados-dev',
   'partitions': '',
   'bdm_file_size': None,
   'columns': [{'name': 'id_municipio',
     'description': 'ID Município - IBGE 7 Dígitos',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'ano',
     'description': 'Ano',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'pib',
     'description': 'Produto Interno Bruto a preços correntes',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'impostos_liquidos',
     'description': 'Impostos, líquidos de subsídios, sobre produtos a preços correntes',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'va',
     'description': 'Valor adicionado bruto a preços correntes total',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'va_agropecuaria',
     'description': 'Valor adicionado bruto a preços correntes da agropecuária',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'va_industria',
     'description': 'Valor adicionado bruto a preços correntes da indústria',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'va_servicos',
     'description': 'Valor adicionado bruto a preços correntes dos serviços, exclusive administração, defesa, educação e saúde públicas e seguridade social',
     'is_in_staging': True,
     'is_partition': False},
    {'name': 'va_adespss',
     'description': 'Valor adicionado bruto a preços correntes da administração, defesa, educação e saúde públicas e seguridade social',
     'is_in_staging': True,
     'is_partition': False}]},
  {'id': '297f5f2f-c5eb-4adb-94e0-b3d630f20ede',
   'name': 'Visualizar',
   'description': None,
   'position': 2,
   'url': 'https://www.ibge.gov.br/explica/pib.php',
   'cache_last_updated': None,
   'cache_url': None,
   'created': '2021-08-16T23:36:44.072002',
   'format': '',
   'hash': '',
   'last_modified': None,
   'metadata_modified': '2021-08-16T23:36:44.064040',
   'mimetype': None,
   'mimetype_inner': None,
   'package_id': '9ffa2eb2-3119-45f1-9353-7c279f1613e9',
   'size': None,
   'state': 'active',
   'url_type': None,
   'resource_type': 'external_link',
   'dataset_id': 'br_ibge_pib',
   'language': ['portuguese'],
   'has_api': 'no',
   'is_free': 'yes',
   'requires_registration': 'no',
   'availability': 'online',
   'country_ip_address_required': None,
   'license': 'mit'}],
 'groups': [{'id': '52e4efe1-c527-4446-88dc-33ec9af7abb8',
   'name': 'economia',
   'title': 'Economia',
   'type': 'group',
   'description': '',
   'image_url': '2019-09-19-055720.95356961SjkfwyNTL.png',
   'created': '2019-09-17T04:33:42.307242',
   'is_organization': False,
   'approval_status': 'approved',
   'state': 'active',
   'capacity': 'public',
   'display_name': 'Economia',
   'image_display_url': 'http://3.87.150.32/uploads/group/2019-09-19-055720.95356961SjkfwyNTL.png'}],
 'owner_org': 'b82f9164-33eb-4e10-9c26-8c99e4591db3',
 'organization': {'id': 'b82f9164-33eb-4e10-9c26-8c99e4591db3',
  'name': 'instituto-brasileiro-de-geografia-e-estatistica',
  'title': 'Instituto Brasileiro de Geografia e Estatística (IBGE)',
  'type': 'organization',
  'description': 'www.ibge.gov.br',
  'image_url': '2019-09-19-153117.558371IBGE.png',
  'created': '2019-09-14T20:59:07.312684',
  'is_organization': True,
  'approval_status': 'approved',
  'state': 'active'},
 'num_tags': 3,
 'tags': [{'id': '76afbcbc-d493-4508-be69-933ffb7c69ae',
   'name': 'PIB',
   'vocabulary_id': None,
   'state': 'active',
   'display_name': 'PIB'},
  {'id': '99df6909-4c0e-43fa-af10-afcccc8a035c',
   'name': 'crescimento',
   'vocabulary_id': None,
   'state': 'active',
   'display_name': 'crescimento'},
  {'id': '347907c3-92c3-45c9-9fcd-080fcd5e383f',
   'name': 'renda',
   'vocabulary_id': None,
   'state': 'active',
   'display_name': 'renda'}],
 'relationships_as_object': [],
 'relationships_as_subject': [],
 'dataset_id': 'br_ibge_pib',
 'isopen': False,
 'extras': [{'key': 'dataset_args', 'value': {'dataset_id': 'br_ibge_pib'}}]}

Reprodução do erro

Após subir o website localmente na branch develop, rode o seguinte código:

from ckanapi import RemoteCKAN
import requests

CKAN_URL = "http://0.0.0.0:5000"

ckan = RemoteCKAN(
    CKAN_URL,
    user_agent="",
    apikey=None
)

pib = requests.get('http://0.0.0.0:5000/api/3/action/package_show?id=br-ibge-pib').json()['result']
validate = ckan.action.package_validate(**pib)
vncsna commented 3 years ago

Solucionado (eu espero) em #87