From 137ea84a025a86ec7277a96bc3fa7c10b429f6fa Mon Sep 17 00:00:00 2001 From: Max Tepkeev Date: Wed, 27 Mar 2019 16:07:04 +0300 Subject: [PATCH] issue #221 --- CHANGELOG.rst | 8 ++++++++ docs/introduction.rst | 4 ++-- docs/resources/issue.rst | 6 ++++-- docs/resources/time_entry.rst | 6 ++++-- redminelib/resultsets.py | 14 ++++++++++++-- tests/test_resultsets.py | 10 ++++++++++ 6 files changed, 40 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e77c3b5..9441a8c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,14 @@ Changelog --------- +2.2.2 (2019-04-XX) +++++++++++++++++++ + +**Improvements**: + +- ResourceSet's ``export()`` method now supports ``columns`` keyword argument which can be either an iterable + of column names or an "all" string which tells Python-Redmine to export all available columns + 2.2.1 (2019-02-28) ++++++++++++++++++ diff --git a/docs/introduction.rst b/docs/introduction.rst index a11f6ec..be6a13f 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -463,8 +463,8 @@ formats of each resource in its documentation. .. code-block:: python >>> issues = redmine.issue.filter(project_id='vacation', status_id='*') - >>> issues.export('pdf', savepath='/home/jsmith') - '/home/jsmith/issues.pdf' + >>> issues.export('csv', savepath='/home/jsmith', columns='all') + '/home/jsmith/issues.csv' Methods +++++++ diff --git a/docs/resources/issue.rst b/docs/resources/issue.rst index 08f87e1..7145fa9 100644 --- a/docs/resources/issue.rst +++ b/docs/resources/issue.rst @@ -460,7 +460,7 @@ Export >>> issue.export('pdf', savepath='/home/jsmith') '/home/jsmith/123.pdf' -.. py:method:: export(fmt, savepath=None, filename=None) +.. py:method:: export(fmt, savepath=None, filename=None, columns=None) :module: redminelib.resultsets.ResourceSet :noindex: @@ -469,12 +469,14 @@ Export :param string fmt: (required). Format to use for export. :param string savepath: (optional). Path where to save the file. :param string filename: (optional). Name that will be used for the file. + :param columns: (optional). Iterable of column names or "all" for all columns. + :type columns: iterable or string :return: String or Object .. code-block:: python >>> issues = redmine.issue.all() - >>> issues.export('csv', savepath='/home/jsmith', filename='issues.csv') + >>> issues.export('csv', savepath='/home/jsmith', filename='issues.csv', columns='all') '/home/jsmith/issues.csv' Journals diff --git a/docs/resources/time_entry.rst b/docs/resources/time_entry.rst index 5d092aa..3e55e5d 100644 --- a/docs/resources/time_entry.rst +++ b/docs/resources/time_entry.rst @@ -260,7 +260,7 @@ Export .. versionadded:: 2.0.0 -.. py:method:: export(fmt, savepath=None, filename=None) +.. py:method:: export(fmt, savepath=None, filename=None, columns=None) :module: redminelib.resultsets.ResourceSet :noindex: @@ -269,10 +269,12 @@ Export :param string fmt: (required). Format to use for export. :param string savepath: (optional). Path where to save the file. :param string filename: (optional). Name that will be used for the file. + :param columns: (optional). Iterable of column names or "all" for all columns. + :type columns: iterable or string :return: String or Object .. code-block:: python >>> entries = redmine.time_entry.all() - >>> entries.export('csv', savepath='/home/jsmith', filename='entries.csv') + >>> entries.export('csv', savepath='/home/jsmith', filename='entries.csv', columns='all') '/home/jsmith/entries.csv' diff --git a/redminelib/resultsets.py b/redminelib/resultsets.py index 6bfef93..5c307ae 100644 --- a/redminelib/resultsets.py +++ b/redminelib/resultsets.py @@ -42,13 +42,15 @@ def total_count(self): return self._total_count - def export(self, fmt, savepath=None, filename=None): + def export(self, fmt, savepath=None, filename=None, columns=None): """ Exports all resources from resource set to requested format if Resource supports that. :param string fmt: (required). Format to use for export, e.g. atom, csv, txt, pdf, html etc. :param string savepath: (optional). Path where to save the file. :param string filename: (optional). Name that will be used for the file. + :param columns: (optional). Iterable of column names or "all" for all columns. + :type columns: iterable or string """ if self.manager.resource_class.query_all_export is None: raise exceptions.ExportNotSupported @@ -58,8 +60,16 @@ def export(self, fmt, savepath=None, filename=None): url = self.manager.redmine.url + formatter.format( self.manager.resource_class.query_all_export, format=fmt, **self.manager.params) + params = formatter.unused_kwargs + + if columns is not None: + if columns == 'all': + columns = 'all_inline' + + params.update({'c[]': columns, 'encoding': 'UTF-8'}) + try: - return self.manager.redmine.download(url, savepath, filename, params=formatter.unused_kwargs) + return self.manager.redmine.download(url, savepath, filename, params=params) except exceptions.UnknownError as e: if e.status_code == 406: raise exceptions.ExportFormatNotSupportedError diff --git a/tests/test_resultsets.py b/tests/test_resultsets.py index e3a44d5..5864d63 100644 --- a/tests/test_resultsets.py +++ b/tests/test_resultsets.py @@ -178,6 +178,16 @@ def test_export(self): self.response.iter_content = lambda chunk_size: (str(num) for num in range(0, 5)) self.assertEqual(self.redmine.issue.all().export('txt', '/foo/bar'), '/foo/bar/issues.txt') + @mock.patch('redminelib.open', mock.mock_open(), create=True) + def test_export_with_all_columns(self): + self.response.iter_content = lambda chunk_size: (str(num) for num in range(0, 5)) + self.assertEqual(self.redmine.issue.all().export('txt', '/foo/bar', columns='all'), '/foo/bar/issues.txt') + + @mock.patch('redminelib.open', mock.mock_open(), create=True) + def test_export_with_custom_columns(self): + self.response.iter_content = lambda chunk_size: (str(num) for num in range(0, 5)) + self.assertEqual(self.redmine.issue.all().export('txt', '/foo/bar', columns=['status']), '/foo/bar/issues.txt') + def test_export_not_supported_exception(self): self.assertRaises(exceptions.ExportNotSupported, lambda: self.redmine.custom_field.all().export('pdf'))