[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):