diff --git a/bijoe/templates/bijoe/visualization.html b/bijoe/templates/bijoe/visualization.html
index d81c6e7..259cc95 100644
--- a/bijoe/templates/bijoe/visualization.html
+++ b/bijoe/templates/bijoe/visualization.html
@@ -15,6 +15,7 @@
{% block actions %}
{% trans "Rename" %}
{% trans "Delete" %}
+ {% trans "Save as" %}
{% trans "Export as ODS" %}
{% trans "Export as JSON" %}
{% trans "URL for IFRAME" %}
diff --git a/bijoe/visualization/urls.py b/bijoe/visualization/urls.py
index 9833d13..3d5d368 100644
--- a/bijoe/visualization/urls.py
+++ b/bijoe/visualization/urls.py
@@ -41,4 +41,5 @@ urlpatterns = [
url(r'(?P\d+)/rename/$', views.rename_visualization, name='rename-visualization'),
url(r'(?P\d+)/delete/$', views.delete_visualization, name='delete-visualization'),
url(r'(?P\d+)/export$', views.export_visualization, name='export-visualization'),
+ url(r'(?P\d+)/save-as/$', views.save_as_visualization, name='save-as-visualization'),
]
diff --git a/bijoe/visualization/views.py b/bijoe/visualization/views.py
index 415fcce..836d43f 100644
--- a/bijoe/visualization/views.py
+++ b/bijoe/visualization/views.py
@@ -120,6 +120,22 @@ class CreateVisualizationView(views.AuthorizationMixin, CubeMixin, CreateView):
return super(CreateVisualizationView, self).form_valid(form)
+class SaveAsVisualizationView(views.AuthorizationMixin, DetailView, CreateView):
+ model = models.Visualization
+ form_class = forms.VisualizationForm
+ template_name = 'bijoe/create_visualization.html'
+ success_url = '/visualization/{id}/'
+
+ def form_valid(self, form):
+ form.instance.parameters = self.get_object().parameters
+ return super(SaveAsVisualizationView, self).form_valid(form)
+
+ def get_initial(self):
+ return {
+ 'name': '%s %s' % (self.get_object().name, _('(Copy)'))
+ }
+
+
class VisualizationView(views.AuthorizationMixin, CubeDisplayMixin, DetailView):
model = models.Visualization
template_name = 'bijoe/visualization.html'
@@ -408,6 +424,7 @@ create_visualization = CreateVisualizationView.as_view()
delete_visualization = DeleteVisualizationView.as_view()
rename_visualization = RenameVisualization.as_view()
export_visualization = ExportVisualizationView.as_view()
+save_as_visualization = SaveAsVisualizationView.as_view()
visualization = VisualizationView.as_view()
visualization_iframe = xframe_options_exempt(VisualizationIframeView.as_view())
visualization_geojson = VisualizationGeoJSONView.as_view()
diff --git a/tests/test_views.py b/tests/test_views.py
index 403f014..50c9ddf 100644
--- a/tests/test_views.py
+++ b/tests/test_views.py
@@ -186,3 +186,15 @@ def test_import_visualization(schema1, app, admin, visualization):
resp = resp.form.submit().follow()
assert '3 visualizations have been created. No visualization updated.' in resp.text
assert Visualization.objects.count() == 3
+
+
+def test_save_as(schema1, app, admin, visualization):
+ login(app, admin)
+ resp = app.get('/visualization/%s/' % visualization.id)
+ resp = resp.click('Save as')
+ assert resp.form['name'].value == 'test (Copy)'
+ resp.form['name'] = 'zob'
+ resp = resp.form.submit().follow()
+ assert Visualization.objects.count() == 2
+ new_visualization = Visualization.objects.get(name='zob')
+ assert new_visualization.parameters == visualization.parameters