[Products.Silva][Sylvain Viollon] Configure things in SMI too.

[email protected] Fri, 25 Oct 2013 15:58:31 +0200
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Sylvain Viollon
date:      Fri Oct 25 15:58:28 2013 +0200
revision:  11871:1a101f8af2f8 in Products.Silva
branch:    2.4
details:   https://hg.infrae.com/Products.Silva?cmd=changeset;node=1a101f8af2f8
modified:  Products/Silva/EmailMessageService.py Products/Silva/ExtensionService.py Products/Silva/ExtensionService_templates/configureextensions.cpt Products/Silva/ExtensionService_templates/manageextensions.pt Products/Silva/File/service.py Products/Silva/silvaxml/xmlimport.py
added:     Products/Silva/ExtensionService_templates/configureextensions.cpt
removed:   
log:       Configure things in SMI too.


diffstat:

 Products/Silva/EmailMessageService.py                             |   19 +-
 Products/Silva/ExtensionService.py                                |   37 ++-
 Products/Silva/ExtensionService_templates/configureextensions.cpt |  136 ++++++++++
 Products/Silva/ExtensionService_templates/manageextensions.pt     |    8 +-
 Products/Silva/File/service.py                                    |   57 +++-
 Products/Silva/silvaxml/xmlimport.py                              |   10 +-
 6 files changed, 243 insertions(+), 24 deletions(-)

diffs (426 lines):

diff -r ff728773db79 -r 1a101f8af2f8 Products/Silva/EmailMessageService.py
--- a/Products/Silva/EmailMessageService.py	Tue Oct 22 12:05:55 2013 +0200
+++ b/Products/Silva/EmailMessageService.py	Fri Oct 25 15:58:28 2013 +0200
@@ -22,6 +22,7 @@
 
 from silva.core import conf as silvaconf
 from silva.core import interfaces
+from silva.core.interfaces import ISilvaConfigurableService
 from silva.core.services.interfaces import IMemberService
 from silva.core.services.base import SilvaService
 from silva.translations import translate as _
@@ -155,7 +156,7 @@
     messages.
     """
     meta_type = 'Silva Message Service'
-    grok.implements(interfaces.IMessageService)
+    grok.implements(interfaces.IMessageService, ISilvaConfigurableService)
     grok.name('service_messages')
     silvaconf.default_service()
     silvaconf.icon('icons/service_message.png')
@@ -291,13 +292,25 @@
 
 
 class EmailMessageSettings(silvaforms.ZMIForm):
+    grok.context(EmailMessageService)
     grok.require('zope2.ViewManagementScreens')
     grok.name('manage_settings')
-    grok.context(EmailMessageService)
 
-    label = _(u"Service Message Configuration")
+    label = _(u"Messaging Configuration")
     description = _(u"Configure settings for email messaging between members. "
                     u"The default MailHost service is used to send messages.")
     ignoreContent = False
     fields = silvaforms.Fields(IEmailMessageSettings)
     actions = silvaforms.Actions(silvaforms.EditAction())
+
+
+class EmailMessageConfiguration(silvaforms.ConfigurationForm):
+    grok.context(EmailMessageService)
+
+    label = _(u"Messaging Configuration")
+    description = _(u"Configure settings for email messaging between members. "
+                    u"The default MailHost service is used to send messages.")
+    fields = silvaforms.Fields(IEmailMessageSettings)
+    actions = silvaforms.Actions(
+        silvaforms.CancelAction(),
+        silvaforms.EditAction())
diff -r ff728773db79 -r 1a101f8af2f8 Products/Silva/ExtensionService.py
--- a/Products/Silva/ExtensionService.py	Tue Oct 22 12:05:55 2013 +0200
+++ b/Products/Silva/ExtensionService.py	Fri Oct 25 15:58:28 2013 +0200
@@ -7,6 +7,7 @@
 import logging
 
 # Zope 3
+from zope.component import getUtility
 from zope import interface, schema
 from five import grok
 
@@ -19,14 +20,17 @@
 # Silva
 from Products.Silva.ExtensionRegistry import extensionRegistry
 
+from silva.ui import rest
 from silva.core import conf as silvaconf
 from silva.core import interfaces
 from silva.core.interfaces import IPublication
+from silva.core.interfaces import ISilvaConfigurableService
 from silva.core.services.base import SilvaService
 from silva.core.services.interfaces import ICataloging, IExtensionService
 from silva.core.services.utils import walk_silva_tree
 from silva.core.upgrade import upgrade
 from silva.core.views import views as silvaviews
+from silva.core.messages.interfaces import IMessageService
 from silva.translations import translate as _
 from zeam.form import silva as silvaforms
 
@@ -105,7 +109,7 @@
 
 class ExtensionService(SilvaService, Folder):
     meta_type = 'Silva Extension Service'
-    grok.implements(IExtensionService)
+    grok.implements(IExtensionService, ISilvaConfigurableService)
     grok.name('service_extensions')
     silvaconf.default_service()
     silvaconf.icon('icons/service_extension.png')
@@ -348,10 +352,7 @@
             self.status = _(u"Partial catalog refreshed")
 
 
-class ManageExtensions(silvaviews.ZMIView):
-    """Form to activate, deactivate, refresh extensions.
-    """
-    grok.name('manage_extensions')
+class ManageExtensionsMixin(object):
     status = None
 
     def refresh_all(self):
@@ -418,7 +419,7 @@
     def quota_enabled(self):
         return self.context._quota_enabled
 
-    def extensions(self):
+    def get_extensions(self):
         """Return non-system extensions
         """
         names = extensionRegistry.get_names()
@@ -432,7 +433,7 @@
                     'is_installed': extension.installer.is_installed(root, extension),
                     'dependencies': map(get_extension, extension.depends)}
 
-    def system_extensions(self):
+    def get_system_extensions(self):
         """Return system extensions
         """
         names = extensionRegistry.get_names()
@@ -440,3 +441,25 @@
             extension = extensionRegistry.get_extension(name)
             if interfaces.ISystemExtension.providedBy(extension):
                 yield extension
+
+
+
+class ManageExtensions(ManageExtensionsMixin, silvaviews.ZMIView):
+    """Form to activate, deactivate, refresh extensions.
+    """
+    grok.name('manage_extensions')
+
+
+class ConfigureExtensions(ManageExtensionsMixin, rest.PageWithTemplateREST):
+    grok.adapts(rest.Screen, ExtensionService)
+    grok.name('admin')
+    grok.require('zope2.ViewManagementScreens')
+
+    def get_menu_title(self):
+        return _('Extensions management')
+
+    def update(self):
+        super(ConfigureExtensions, self).update()
+        if self.status:
+            service = getUtility(IMessageService)
+            service.send(self.status, self.request, namespace='feedbac')
diff -r ff728773db79 -r 1a101f8af2f8 Products/Silva/ExtensionService_templates/configureextensions.cpt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Products/Silva/ExtensionService_templates/configureextensions.cpt	Fri Oct 25 15:58:28 2013 +0200
@@ -0,0 +1,136 @@
+<tal:configure tal:define="root context.get_root()"
+               i18n:domain="silva">
+    <div class="form-head">
+      <h3 i18n:translate="">
+        Extensions management
+      </h3>
+      <p>
+        Software version: <span tal:replace="root.get_silva_software_version()">.
+      </p>
+      <p>
+        Site version: <span tal:replace="root.get_silva_content_version()">.
+      </p>
+      <p tal:condition="context.get_site_quota()"
+         i18n:translate="">
+        This site has a global quota of <span tal:replace="context.get_site_quota()" i18n:name="used" /> MB.
+      </p>
+      <p tal:condition="not context.get_site_quota()"
+         i18n:translate="">
+        This site has no global quota restrictions.
+      </p>
+    </div>
+
+    <form class="form-fields-container">
+    <div class="form-footer">
+      <div class="form-controls">
+        <a class="form-control" name="refresh_all"
+           i18n:translate="">
+          Refresh all
+        </a>
+        <a class="form-control" name="install_documentation"
+           tal:condition="context.is_installed('silva.app.document') and root._getOb('docs', None) is None"
+           i18n:translate="">
+          Install documentation
+        </a>
+        <a class="form-control" name="refresh_catalog"
+           i18n:translate="">
+          Rebuild catalog
+        </a>
+        <tal:quota tal:condition="not: context.get_site_quota()">
+          <!-- Site quota is not enabled, so you can enable or not the
+               feature. -->
+          <a class="form-control" name="disable_quota_subsystem"
+             tal:condition="rest.quota_enabled"
+             i18n:translate="">
+            Disable quota subsystem
+          </a>
+          <a class="form-control" name="enable_quota_subsystem"
+             tal:condition="not rest.quota_enabled"
+             i18n:translate="">
+            Enable quota subsystem
+          </a>
+        </tal:quota>
+        <a class="form-control" name="purge_old_versions"
+           i18n:translate="">
+          Purge old versions
+        </a>
+        <a class="form-control" name="upgrade_all" value=""
+           data-confirmation="This will upgrade all Silva content, and may take a long time on a large site. This is, however, necessary to make old Silva content work with new versions."
+           data-confirmation-title="Are you sure you want to continue?"
+           i18n:attributes="data-confirmation-title data-confirmation"
+           i18n:translate="">
+          Upgrade content
+        </a>
+      </div>
+    </div>
+    </form>
+
+    <div class="form-header">
+      <h4 i18n:translate="">Available extensions</h4>
+    </div>
+
+    <tal:extensions tal:repeat="extension rest.get_extensions()">
+      <div tal:define="bg_color extension.is_installed and  'White' or 'LightGrey'"
+           tal:attributes="style string:width:70%;; border:solid 1px;; padding:1ex;; margin:1ex;; background:${bg_color};;" >
+        <h3 style="margin: 0 0 0.5ex;" tal:content="extension.info.title" />
+
+        <div style="float:right; width:40%; border: 1px solid black; margin: 0px 0px 15px 15px"
+             tal:condition="extension.dependencies">
+          <h5 class="form-title">Dependencies</h5>
+          <ul style="padding-left: 0;list-style-position:inside;margin-top:0;">
+            <li class="list-item"
+                tal:repeat="dependency extension.dependencies">
+              <span tal:content="dependency.title" />
+            </li>
+          </ul>
+        </div>
+
+        <p style="margin: 0 0 1ex;" tal:content="extension.info.version"/>
+        <p style="margin: 0 0 1ex;" tal:content="extension.info.description"/>
+
+        <form name="#"
+              tal:define="name extension.info.name"
+              tal:attributes="name name">
+          <input type="hidden" name="name"
+                 tal:attributes="value name" />
+          <tal:regular tal:condition="name != 'Silva'">
+            <div class="form-footer">
+              <div class="form-controls">
+                <a class="form-control" name="install"
+                   tal:condition="not extension.is_installed"
+                   i18n:translate="">
+                  Activate
+                </a>
+                <a class="form-control" name="uninstall"
+                   tal:condition="extension.is_installed"
+                   i18n:translate="">
+                  Deactivate
+                </a>
+                <a class="form-control" name="refresh"
+                   tal:condition="extension.is_installed"
+                   i18n:translate="">
+                  Refresh
+                </a>
+              </div>
+            </div>
+          </tal:regular>
+          <tal:systems tal:condition="name == 'Silva'">
+            <ul>
+              <li tal:repeat="extension_system rest.get_system_extensions()">
+                <span tal:replace="extension_system.name" />
+                (<span tal:replace="extension_system.version" />)
+              </li>
+            </ul>
+            <div class="form-footer">
+              <div class="form-controls">
+                <a class="form-control" name="refresh"
+                   i18n:translate="">
+                  Refresh
+                </a>
+              </div>
+            </div>
+          </tal:systems>
+        </form>
+      </div>
+    </tal:extensions>
+</tal:configure>
diff -r ff728773db79 -r 1a101f8af2f8 Products/Silva/ExtensionService_templates/manageextensions.pt
--- a/Products/Silva/ExtensionService_templates/manageextensions.pt	Tue Oct 22 12:05:55 2013 +0200
+++ b/Products/Silva/ExtensionService_templates/manageextensions.pt	Fri Oct 25 15:58:28 2013 +0200
@@ -71,7 +71,7 @@
       <h3 i18n:translate="">Available extensions</h3>
 
       <tal:extension
-         tal:repeat="extension view/extensions">
+         tal:repeat="extension view/get_extensions">
         <div tal:define="bg_color python:extension['is_installed'] and  'White' or 'LightGrey'"
              tal:attributes="style string:width:70%;; border:solid 1px;; padding:1ex;; margin:1ex;; background:${bg_color};;" >
           <div style="float:right; width:40%;">
@@ -106,9 +106,9 @@
             </tal:cond>
             <tal:cond tal:condition="python:name == 'Silva'">
               <ul>
-                <li tal:repeat="system_ext view/system_extensions">
-                  <span tal:replace="system_ext/name" />
-                  (<span tal:replace="system_ext/version" />)
+                <li tal:repeat="extension_system view/get_system_extensions">
+                  <span tal:replace="extension_system/name" />
+                  (<span tal:replace="extension_system/version" />)
                 </li>
               </ul>
               <input type="submit" name="refresh" value="refresh"
diff -r ff728773db79 -r 1a101f8af2f8 Products/Silva/File/service.py
--- a/Products/Silva/File/service.py	Tue Oct 22 12:05:55 2013 +0200
+++ b/Products/Silva/File/service.py	Fri Oct 25 15:58:28 2013 +0200
@@ -21,6 +21,7 @@
 from Products.Silva.File.content import BlobFile, ZODBFile
 from silva.core import conf as silvaconf
 from silva.core import interfaces
+from silva.core.interfaces import ISilvaConfigurableService
 from silva.core.services.base import SilvaService
 from silva.core.services.interfaces import IFilesService
 from silva.core.upgrade import upgrade
@@ -41,7 +42,7 @@
 
 class FilesService(SilvaService):
     meta_type = 'Silva Files Service'
-    grok.implements(IFilesService)
+    grok.implements(IFilesService, ISilvaConfigurableService)
     grok.name('service_files')
     silvaconf.default_service()
     silvaconf.icon('icons/service_files.png')
@@ -95,10 +96,18 @@
     label = _(u"Configure file storage")
 
 
+class FileServiceConfiguration(silvaforms.ComposedConfigurationForm):
+    """Edit File Service.
+    """
+    grok.context(FilesService)
+
+    label = _(u"Configure file storage")
+
+
 class FileServiceSettings(silvaforms.ZMISubForm):
     grok.context(FilesService)
-    silvaforms.view(FileServiceManagementView)
-    silvaforms.order(10)
+    grok.view(FileServiceManagementView)
+    grok.order(10)
 
     label = _(u"Select storage")
     fields = silvaforms.Fields(IFilesService)
@@ -106,10 +115,23 @@
     ignoreContent = False
 
 
+class FileServiceSettingsConfiguration(silvaforms.SMISubForm):
+    grok.context(FilesService)
+    silvaforms.view(FileServiceConfiguration)
+    silvaforms.order(10)
+
+    label = _(u"Select storage")
+    fields = silvaforms.Fields(IFilesService)
+    actions = silvaforms.Actions(
+        silvaforms.CancelAction(),
+        silvaforms.EditAction())
+    ignoreContent = False
+
+
 class FileServiceConvert(silvaforms.ZMISubForm):
     grok.context(FilesService)
-    silvaforms.view(FileServiceManagementView)
-    silvaforms.order(20)
+    grok.view(FileServiceManagementView)
+    grok.order(20)
 
     label = _(u"Convert stored files")
     description = _(u"Convert all currently stored file to "
@@ -128,6 +150,31 @@
                         u'Check the log for more details.')
 
 
+class FileServiceConvertConfiguration(silvaforms.SMISubForm):
+    grok.context(FilesService)
+    grok.view(FileServiceConfiguration)
+    grok.order(20)
+
+    label = _(u"Convert stored files")
+    description = _(u"Convert all currently stored file to "
+                    u"the current set storage.")
+    actions = silvaforms.Actions(silvaforms.CancelAction())
+
+    def available(self):
+        if self.context.storage is None:
+            return False
+        return self.context.storage is not ZODBFile
+
+    @silvaforms.action(_(u'Convert all files'))
+    def convert(self):
+        parent = self.context.get_publication()
+        self.context.convert_storage(parent)
+        self.send_message(
+            _(u'Storage for Silva Files and Images converted. '
+              u'Check the log for more details.'),
+            type='feedback')
+
+
 class StorageConverterHelper(object):
     """The purpose of this converter is to stop convertion if there is
     an another configuration.
diff -r ff728773db79 -r 1a101f8af2f8 Products/Silva/silvaxml/xmlimport.py
--- a/Products/Silva/silvaxml/xmlimport.py	Tue Oct 22 12:05:55 2013 +0200
+++ b/Products/Silva/silvaxml/xmlimport.py	Fri Oct 25 15:58:28 2013 +0200
@@ -22,11 +22,11 @@
     ICataloging(content).index()
 
 
-# @grok.subscribe(interfaces.IQuotaObject, IContentImported)
-# def update_quota_import_content(content, event):
-#     """Update the quota of imported content (to be sure).
-#     """
-#     content.update_quota()
[email protected](interfaces.IQuotaObject, IContentImported)
+def update_quota_import_content(content, event):
+    """Update the quota of imported content (to be sure).
+    """
+    content.update_quota()
 
 
 class FolderHandler(handlers.SilvaContainerHandler):