Ejemplo n.º 1
0
 def __init__(self,
              datadict=None,
              _distributions=None,
              _distribution_literal=False):
     import helpers
     required_keys = [
         "license_title", "maintainer", "private", "maintainer_email",
         "author", "author_email", "state", "type", "groups", "license_id",
         "owner_org", "url", "notes", "owner_org", "license_url", "isopen",
         "title", "title", "name"
     ]
     if not _distribution_literal:
         if _distributions:
             if isinstance(_distributions, Distribution):
                 _distributions = [_distributions]
             elif isinstance(_distributions, list):
                 import helpers
                 if not helpers.list_of(_distributions, Distribution):
                     raise TypeError(
                         'Las distribuciones provistas, no son de tipo Distribution...'
                     )
             else:
                 _distributions = []
         else:
             _distributions = []
     elif not isinstance(_distributions, list) \
             or not helpers.list_of(_distributions, dict):
         raise TypeError(
             'Las distrubuciones \"literales\", solo pueden ser de clase list.'
         )
     super(Dataset, self).__init__(_required_keys=required_keys,
                                   datadict=datadict,
                                   _forced_keys={
                                       'resources': _distributions,
                                       'package_id': ''
                                   })
Ejemplo n.º 2
0
    def save(self, _obj=None, only_metadata=False, _views=True):
        """
        Guarda un _obj dentro de CKAN.

        Si el _obj existe, lo actualiza, si no, lo creo.
        De la misma manera son tratadas las distribuciones que el mismo contenga.

        Args:
            - _obj: _obj(). Objeto de que se desea salvar.
            - only_metadata: bool(). Pushear solo metadata.
            - _views: bool(). Flag. Mantener vistas remotas o eliminar.
        Returns:
             - bool():
                - True se salvo correctamente el _obj.
                - False: Fallo la carga del _obj.
        """
        from models import Dataset, Distribution
        ds_status = False
        dis_status = False
        distributions = []
        if type(_obj) not in [Dataset, list, Distribution]:
            raise TypeError
        if isinstance(_obj, list):
            # Si es una lista, solo voy a intentar salvar los
            #  que son instancias de la clase _obj.
            for o in _obj:
                if isinstance(o, (Dataset, Distribution)):
                    self.save(_obj=o,
                              only_metadata=only_metadata,
                              _views=_views)
                else:
                    # Si _obj[n] no es _obj o Distribution lo omito.
                    self.log.info('Se omite {} por no ser una instancia de '
                                  '_obj() o de Distribution.'.format(o))
        if isinstance(_obj, Dataset):
            if 'resources' in _obj.__dict__.keys():
                distributions = _obj.resources
                _obj.resources = []
            else:
                dis_status = True
            ds_name = self._render_name(title=_obj.title)

            try:
                ds_name = ds_name.decode('utf-8 ')
            except UnicodeEncodeError:
                pass

            if self.exists(id_or_name=ds_name):
                # Actualizo el _obj.
                self.log.info(
                    'El _obj \"{}\" existe, por tanto, se actualizara.'.format(
                        ds_name))
                # Antes de actualizar debo bajar toda la metadata del dataset,
                # para que no se sobre escriba de manera erroenea el mismo al
                # realizar el update.
                ds_remote = self.freeze_dataset(ds_name)
                if self.update_dataset(
                        dataset=self.diff_datasets(ds_remote, _obj)):
                    self.log.info(
                        '_obj \"{}\" actualizado correctamente.'.format(
                            ds_name))
                    ds_status = True
            else:
                # Caso contrario, lo creo.
                self.log.info(
                    'El _obj \"{d}\" no existe. Creando _obj \"{d}\"...'.
                    format(d=ds_name))
                if self.create_dataset(dataset=_obj):
                    self.log.info(
                        '_obj \"{}\" fue creado con exito.'.format(ds_name))
                    ds_status = True
            if len(distributions) > 0:
                self.log.info('Guardando distribuciones({})...'.format(
                    len(distributions)))
                for d in distributions:
                    d.package_id = ds_name
                    self.save(_obj=d,
                              only_metadata=only_metadata,
                              _views=_views)
            return ds_status
        import helpers
        if isinstance(_obj, Distribution):
            if isinstance(_obj, Distribution):
                dist_name = _obj.name
                self.log.info(
                    'Salvando Distribucion \"{}\".'.format(dist_name))
                if self.exists(id_or_name=self._render_name(dist_name),
                               search_for_datasets=False):
                    self.log.info(
                        'Actualizando distribucion \"{}\".'.format(dist_name))
                    if self._push_distribution(_d=_obj,
                                               only_metadata=only_metadata,
                                               _views=_views,
                                               update=True):
                        dis_status = True
                else:
                    self.log.info(
                        'La distribucion \"%s\" no existe, creando nueva distribucion.'
                        % dist_name)
                    if self._push_distribution(_d=_obj,
                                               only_metadata=only_metadata,
                                               _views=_views):
                        dis_status = True
        elif helpers.list_of(_obj, Distribution):
            for m in _obj.__dict__.keys():
                self.save(m, only_metadata=only_metadata, _views=_views)
        return dis_status and ds_status
 def test_value_error(self):
     @assure(list_of(int))
     def f(x):
         return x
     with self.assertRaises(ValueError):
         f(["bla"])
 def test_convert(self):
     @assure(list_of(int))
     def f(x):
         return x
     self.assertEquals([1,0], f(["1", "0"]))
 def test_pass_through(self):
     @assure(list_of(str))
     def f(x):
         return x
     self.assertEquals(["bla", "blubb"], f(["bla", "blubb"]))