diff --git a/ckan/cli/cli.py b/ckan/cli/cli.py index 236196c88c6..b6950e9575a 100644 --- a/ckan/cli/cli.py +++ b/ckan/cli/cli.py @@ -4,7 +4,10 @@ import click -from ckan.cli import click_config_option, db, load_config, search_index, server +from ckan.cli import ( + click_config_option, db, load_config, search_index, server, + dataset, +) from ckan.config.middleware import make_app log = logging.getLogger(__name__) @@ -28,3 +31,4 @@ def ckan(ctx, config, *args, **kwargs): ckan.add_command(server.run) ckan.add_command(db.db) ckan.add_command(search_index.search_index) +ckan.add_command(dataset.dataset) diff --git a/ckan/cli/dataset.py b/ckan/cli/dataset.py new file mode 100644 index 00000000000..f62056a47e0 --- /dev/null +++ b/ckan/cli/dataset.py @@ -0,0 +1,87 @@ +# encoding: utf-8 + +import logging +import pprint + +import click +from six import text_type + +import ckan.logic as logic +import ckan.model as model + +log = logging.getLogger(__name__) + + +@click.group() +def dataset(): + u'''Manage datasets + ''' + + +@dataset.command() +@click.argument(u'package') +def show(package): + u'''Shows dataset properties. + ''' + dataset = _get_dataset(package) + click.echo(pprint.pformat(dataset.as_dict())) + + +@dataset.command() +def list(): + u'''Lists datasets. + ''' + click.echo(u'Datasets:') + datasets = model.Session.query(model.Package) + click.echo(u'count = %i' % datasets.count()) + for dataset in datasets: + state = ( + u'(%s)' % dataset.state + ) if dataset.state != u'active' else u'' + + click.echo( + u'%s %s %s' % + (click.style(dataset.id, bold=True), dataset.name, state) + ) + + +@dataset.command() +@click.argument(u'package') +def delete(package): + u'''Changes dataset state to 'deleted'. + ''' + dataset = _get_dataset(package) + old_state = dataset.state + + model.repo.new_revision() + dataset.delete() + model.repo.commit_and_remove() + dataset = _get_dataset(package) + click.echo( + u'%s %s -> %s' % ( + dataset.name, click.style(old_state, fg=u'red'), + click.style(dataset.state, fg=u'green') + ) + ) + + +@dataset.command() +@click.argument(u'package') +def purge(package): + u'''Removes dataset from db entirely. + ''' + dataset = _get_dataset(package) + name = dataset.name + + site_user = logic.get_action(u'get_site_user')({u'ignore_auth': True}, {}) + context = {u'user': site_user[u'name']} + logic.get_action(u'dataset_purge')(context, {u'id': package}) + click.echo(u'%s purged' % name) + + +def _get_dataset(package): + dataset = model.Package.get(text_type(package)) + assert dataset, u'Could not find dataset matching reference: {}'.format( + package + ) + return dataset