From 49817beb30a3cf244f3e8d7c7ed6e56b5ec69572 Mon Sep 17 00:00:00 2001 From: Ian Ward Date: Fri, 6 Jan 2017 12:39:23 -0500 Subject: [PATCH] [#3390] datastore: dump CSV for Excel with &bom=true --- ckanext/datastore/controller.py | 8 +++++++- ckanext/datastore/plugin.py | 2 +- doc/maintaining/datastore.rst | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ckanext/datastore/controller.py b/ckanext/datastore/controller.py index 97a53d98677..9e5bdec40f3 100644 --- a/ckanext/datastore/controller.py +++ b/ckanext/datastore/controller.py @@ -18,12 +18,15 @@ ) int_validator = get_validator('int_validator') +boolean_validator = get_validator('boolean_validator') + +UTF8_BOM = u'\uFEFF'.encode('utf-8') PAGINATE_BY = 10000 class DatastoreController(BaseController): - def dump(self, resource_id): + def dump_csv(self, resource_id): try: offset = int_validator(request.GET.get('offset', 0), {}) except Invalid as e: @@ -32,6 +35,7 @@ def dump(self, resource_id): limit = int_validator(request.GET.get('limit'), {}) except Invalid as e: abort(400, u'limit: ' + e.error) + bom = boolean_validator(request.GET.get('bom'), {}) wr = None while True: @@ -57,6 +61,8 @@ def dump(self, resource_id): wr = csv.writer(response, encoding='utf-8') header = [x['id'] for x in result['fields']] + if bom: + response.write(UTF8_BOM) wr.writerow(header) for record in result['records']: diff --git a/ckanext/datastore/plugin.py b/ckanext/datastore/plugin.py index 073ffcee214..4b725fed813 100644 --- a/ckanext/datastore/plugin.py +++ b/ckanext/datastore/plugin.py @@ -248,7 +248,7 @@ def get_auth_functions(self): def before_map(self, m): m.connect('/datastore/dump/{resource_id}', controller='ckanext.datastore.controller:DatastoreController', - action='dump') + action='dump_csv') return m def before_show(self, resource_dict): diff --git a/doc/maintaining/datastore.rst b/doc/maintaining/datastore.rst index 6928e683141..8878d41ef6c 100644 --- a/doc/maintaining/datastore.rst +++ b/doc/maintaining/datastore.rst @@ -280,6 +280,8 @@ Download resource as CSV A DataStore resource can be downloaded in the `CSV`_ file format from ``{CKAN-URL}/datastore/dump/{RESOURCE-ID}``. +For an Excel-compatible CSV file use ``{CKAN-URL}/datastore/dump/{RESOURCE-ID}&bom=true`` + .. _CSV: https://en.wikipedia.org/wiki/Comma-separated_values