src/pyams_content/shared/site/zmi/container.py
changeset 736 4eed94fdf7c3
parent 731 a39cedc655ff
child 738 046189ebbbd0
--- a/src/pyams_content/shared/site/zmi/container.py	Mon Jun 25 16:09:33 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/container.py	Mon Jun 25 10:09:38 2018 +0200
@@ -27,7 +27,7 @@
 from pyams_i18n.interfaces import II18n
 from pyams_skin.interfaces import IInnerPage, IPageHeader
 from pyams_skin.interfaces.container import ITableElementEditor, ITableElementName, ITableWithActions
-from pyams_skin.interfaces.viewlet import IBreadcrumbItem, ITableItemColumnActionsMenu
+from pyams_skin.interfaces.viewlet import IBreadcrumbItem, ITableItemColumnActionsMenu, IContextActions
 from pyams_skin.layer import IPyAMSLayer
 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
 from pyams_utils.interfaces.traversing import IPathElements
@@ -58,6 +58,7 @@
 from pyams_utils.registry import get_utility
 from pyams_utils.timezone import tztime
 from pyams_utils.traversing import get_parent
+from pyams_utils.unicode import translate_string
 from pyams_utils.url import absolute_url
 from pyams_viewlet.manager import viewletmanager_config
 from pyams_viewlet.viewlet import viewlet_config
@@ -632,3 +633,62 @@
     def url(self):
         version = IWorkflowVersions(self.context).get_last_versions(count=1)[0]
         return absolute_url(version, self.request, self.view_name)
+
+
+#
+# Site container rename view
+#
+
+@viewlet_config(name='rename-item.menu', context=ISiteContainer, layer=IPyAMSLayer,
+                view=ISiteTreeTable, manager=ITableItemColumnActionsMenu,
+                permission=MANAGE_SITE_PERMISSION, weight=900)
+@viewlet_config(name='rename-item.menu', context=ISiteContainer, layer=IPyAMSLayer,
+                view=Interface, manager=IContextActions,
+                permission=MANAGE_SITE_PERMISSION, weight=900)
+class SiteContainerRenameMenu(ToolbarMenuItem):
+    """Site container rename menu"""
+
+    label = _("Change URL...")
+    label_css_class = 'fa fa-fw fa-edit'
+    url = 'rename-item.html'
+    modal_target = True
+
+
+@pagelet_config(name='rename-item.html', context=ISiteContainer, layer=IPyAMSLayer,
+                permission=MANAGE_SITE_PERMISSION)
+@ajax_config(name='rename-item.json', context=ISiteContainer, layer=IPyAMSLayer)
+class SiteContainerRenameForm(AdminDialogEditForm):
+    """Site container rename form"""
+
+    prefix = 'rename_item.'
+
+    legend = _("Change item URL")
+
+    fields = field.Fields(ISiteContainer).select('__name__')
+    edit_permission = MANAGE_SITE_PERMISSION
+
+    def updateWidgets(self, prefix=None):
+        super(SiteContainerRenameForm, self).updateWidgets(prefix)
+        self.widgets['__name__'].label = _("Item URL part")
+
+    def update_content(self, content, data):
+        old_name = content.__name__
+        changes = super(SiteContainerRenameForm, self).update_content(content, data)
+        if changes:
+            # revert rename to adjust container properties
+            new_name = translate_string(content.__name__, spaces='-', keep_chars='-')
+            content.__name__ = old_name
+            parent = content.__parent__
+            parent[new_name] = content
+            del parent[old_name]
+        return changes
+
+    def get_ajax_output(self, changes):
+        if changes:
+            return {
+                'status': 'redirect',
+                'location': absolute_url(self.context, self.request, 'admin'),
+                'message': self.request.localizer.translate(self.successMessage)
+            }
+        else:
+            return super(SiteContainerRenameForm, self).get_ajax_output(changes)