Commit 7cf4f4f9 authored by Paul Brown's avatar Paul Brown Committed by Iuri de Silvio

add the ability to add multiple export types, remove unnecessary expose and consolidate return_url

parent a8e8a535
...@@ -688,10 +688,10 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -688,10 +688,10 @@ class BaseModelView(BaseView, ActionsMixin):
Unlimited by default. Uses `page_size` if set to `None`. Unlimited by default. Uses `page_size` if set to `None`.
""" """
export_type = 'csv' export_types = ['csv']
""" """
Export type, `csv` as default and can be changed to any tablib A list of available export filetypes. `csv` only is default, but any
supported type. filetypes supported by tablib can be used.
Check tablib for https://github.com/kennethreitz/tablib/bloab/master/README.rst Check tablib for https://github.com/kennethreitz/tablib/bloab/master/README.rst
for supported types. for supported types.
...@@ -2049,22 +2049,21 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -2049,22 +2049,21 @@ class BaseModelView(BaseView, ActionsMixin):
@expose('/export/<export_type>/') @expose('/export/<export_type>/')
def export(self, export_type): def export(self, export_type):
if export_type == 'csv':
return self.export_csv()
else:
return self._export_tablib(export_type)
@expose('/export/csv/')
def export_csv(self):
"""
Export a CSV of records.
"""
return_url = get_redirect_target() or self.get_url('.index_view') return_url = get_redirect_target() or self.get_url('.index_view')
if not self.can_export: if not self.can_export or (export_type not in self.export_types):
flash(gettext('Permission denied.')) flash(gettext('Permission denied.'))
return redirect(return_url) return redirect(return_url)
if export_type == 'csv':
return self._export_csv(return_url)
else:
return self._export_tablib(export_type, return_url)
def _export_csv(self, return_url):
"""
Export a CSV of records as a stream.
"""
count, data = self._export_data() count, data = self._export_data()
# https://docs.djangoproject.com/en/1.8/howto/outputting-csv/ # https://docs.djangoproject.com/en/1.8/howto/outputting-csv/
...@@ -2102,17 +2101,14 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -2102,17 +2101,14 @@ class BaseModelView(BaseView, ActionsMixin):
mimetype='text/csv' mimetype='text/csv'
) )
def _export_tablib(self, export_type): def _export_tablib(self, export_type, return_url):
return_url = get_redirect_target() or self.get_url('.index_view') """
Exports a variety of formats using the tablib library.
"""
if tablib is None: if tablib is None:
flash(gettext('Tablib dependency not installed.')) flash(gettext('Tablib dependency not installed.'))
return redirect(return_url) return redirect(return_url)
if not self.can_export:
flash(gettext('Permission denied.'))
return redirect(return_url)
filename = self.get_export_name(export_type) filename = self.get_export_name(export_type)
disposition = 'attachment;filename=%s' % (secure_filename(filename),) disposition = 'attachment;filename=%s' % (secure_filename(filename),)
......
...@@ -11,6 +11,27 @@ ...@@ -11,6 +11,27 @@
</ul> </ul>
{% endmacro %} {% endmacro %}
{% macro export_options(btn_class='dropdown-toggle') %}
{% if admin_view.export_types|length > 1 %}
<li class="dropdown">
<a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">
{{ _gettext('Export') }}<b class="caret"></b>
</a>
<ul class="dropdown-menu field-filters">
{% for export_type in admin_view.export_types %}
<li>
<a href="{{ get_url('.export', export_type=export_type, **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') + ' ' + export_type|upper }}</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li>
<a href="{{ get_url('.export', export_type=admin_view.export_types[0], **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') }}</a>
</li>
{% endif %}
{% endmacro %}
{% macro filter_form() %} {% macro filter_form() %}
<form id="filter_form" method="GET" action="{{ return_url }}"> <form id="filter_form" method="GET" action="{{ return_url }}">
<div class="pull-right"> <div class="pull-right">
......
...@@ -27,9 +27,7 @@ ...@@ -27,9 +27,7 @@
{% endif %} {% endif %}
{% if admin_view.can_export %} {% if admin_view.can_export %}
<li> {{ model_layout.export_options() }}
<a href="{{ get_url('.export', export_type=admin_view.export_type, **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') }}</a>
</li>
{% endif %} {% endif %}
{% block model_menu_bar_before_filters %}{% endblock %} {% block model_menu_bar_before_filters %}{% endblock %}
......
...@@ -11,6 +11,27 @@ ...@@ -11,6 +11,27 @@
</ul> </ul>
{% endmacro %} {% endmacro %}
{% macro export_options(btn_class='dropdown-toggle') %}
{% if admin_view.export_types|length > 1 %}
<li class="dropdown">
<a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">
{{ _gettext('Export') }}<b class="caret"></b>
</a>
<ul class="dropdown-menu field-filters">
{% for export_type in admin_view.export_types %}
<li>
<a href="{{ get_url('.export', export_type=export_type, **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') + ' ' + export_type|upper }}</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li>
<a href="{{ get_url('.export', export_type=admin_view.export_types[0], **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') }}</a>
</li>
{% endif %}
{% endmacro %}
{% macro filter_form() %} {% macro filter_form() %}
<form id="filter_form" method="GET" action="{{ return_url }}"> <form id="filter_form" method="GET" action="{{ return_url }}">
<div class="pull-right"> <div class="pull-right">
......
...@@ -27,9 +27,7 @@ ...@@ -27,9 +27,7 @@
{% endif %} {% endif %}
{% if admin_view.can_export %} {% if admin_view.can_export %}
<li> {{ model_layout.export_options() }}
<a href="{{ get_url('.export', export_type=admin_view.export_type, **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') }}</a>
</li>
{% endif %} {% endif %}
{% block model_menu_bar_before_filters %}{% endblock %} {% block model_menu_bar_before_filters %}{% endblock %}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment