Skip to content

Provide example of how to use the new package_revise #181

Open

Description

@mcarans

How do I use the new CKAN 2.9 function package_revise?

Currently to do a resource update with file upload, I can do something like:

file = open('/tmp/datafile.xlsx', 'rb')
files = [('upload', file)]
call_action('resource_update', {'id': 'my uuid', 'name': 'MyResource'...}, apikey=xyz, files=files)

Let's say I have a dataset with name "MyDataset" I want to update, removing resources 0 and 2, updating the description of resource 1 and uploading a new file for resource 1. I understand from documentation that the parameters would be something like:

    match = {"name":"MyDataset"}
    filter = ["-resources__0", "-resources__2"]
    update = {"resources__1__description": "My new description"}
    update__resources__1__upload@/tmp/datafile.xlsx

Can you show in code how I pass those things in the call_action? For example, do they all go in the second parameter (data_dict) and if so, how does the file upload one go in there since it isn't a key value pair? Do I still need to use the "files" parameter?

Activity

  1. wardi commented on Feb 1, 2021

    @wardi
    Contributor

    The remote CKAN action API may be called in one of three ways:

    1. GET request with string parameters
    2. POST request with JSON body
    3. multipart POST request with string parameters and file attachments

    only number 3 can be used when uploading files, so JSON can't be used to nest the other parameter values sent as part of the same call. package_revise works around this by also accepting JSON as a string for the top level parameters. e.g.

    myckan.call_action(
        'package_revise',
        {'match': '{"name":"MyDataset"}'},  # values need to be JSON strings when uploading files
        files={'update__resources__1__upload': myfile},
    )

    I could update ckanapi to automatically convert lists and dictionaries at the top level of multipart POST requests to their JSON versions, but as far as I know only package_revise accepts this automatically.

  2. mcarans commented on Feb 3, 2021

    @mcarans
    ContributorAuthor

    Thanks! Is there any reason to use package_update any more?

  3. wardi commented on Feb 4, 2021

    @wardi
    Contributor

    no, but package_update does have a simpler interface for replacing all the metadata fields in a dataset.

  4. paulmueller commented on Sep 2, 2021

    @paulmueller

    @ghost package_revise is safe, because it allows concurrent calls, whereas resource_create may result in data loss if other actions (including package_revise) are changing the dataset/package at the same time.

    [EDIT: I guess it's the right time here to talk to ghosts]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions