class IndexerEditForm(silvaforms.SMIForm): """Edit form for an indexer. There is not that much to edit however. """ grok.context(IIndexer) grok.require('silva.ReadSilvaContent') grok.implements(IEditScreen) label = _("Update Silva Indexer") description = _( u"An index is not editable. " u"However, you can update the index to include recent added content.") actions = silvaforms.Actions(silvaforms.CancelEditAction()) def update_index_available(self): return checkPermission('silva.ChangeSilvaContent', self.context) @silvaforms.action( _(u"Update index"), accesskey=u"u", available=update_index_available, description=_(u"Update index to include recent added content")) def update_index(self): self.context.update() notify(ObjectModifiedEvent(self.context)) self.send_message(_(u"Index content have been successfully updated."), type="feedback")
class FileServiceSettings(silvaforms.ZMISubForm): grok.context(FilesService) grok.view(FileServiceManagementView) grok.order(10) label = _(u"Select storage") fields = silvaforms.Fields(IFilesService) actions = silvaforms.Actions(silvaforms.EditAction()) ignoreContent = False
class EmailMessageConfiguration(silvaforms.ConfigurationForm): grok.context(EmailMessageService) label = _("Messaging configuration") description = _("Configure settings for email messaging between members. " "The default MailHost service is used to send messages.") fields = silvaforms.Fields(IEmailMessageSettings) actions = silvaforms.Actions(silvaforms.CancelConfigurationAction(), silvaforms.EditAction())
class ServicePollsConfiguration(silvaforms.ZMIForm): """Configure service polls settings. """ grok.context(IServicePolls) grok.name('manage_settings') label = "Configure globals poll settings" fields = silvaforms.Fields(IServicePollsConfiguration) actions = silvaforms.Actions(silvaforms.EditAction()) ignoreContext = 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.CancelConfigurationAction(), silvaforms.EditAction()) ignoreContent = False
class EmailMessageSettings(silvaforms.ZMIForm): grok.context(EmailMessageService) grok.require('zope2.ViewManagementScreens') grok.name('manage_settings') 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 AddTabBlock(silvaforms.RESTPopupForm): grok.adapts(TabBlock, IPage) grok.name('add') label = u'Add tabular content' fields = silvaforms.Fields(ITabFields) actions = silvaforms.Actions(silvaforms.CancelAction(), AddTabBlockAction()) def __init__(self, context, request, configuration, restrictions): super(AddTabBlock, self).__init__(context, request) self.restrictions = restrictions self.configuration = configuration
class GhostAssetEditForm(silvaforms.SMISubForm): """ Edit form Ghost Folder """ grok.context(IGhostAsset) grok.view(AssetEditTab) grok.order(10) label = _(u'Edit ghost') ignoreContent = False dataManager = silvaforms.SilvaDataManager dataValidators = [TargetValidator('haunted', IAsset, adding=False)] fields = silvaforms.Fields(IGhostAssetSchema).omit('id') actions = silvaforms.Actions(silvaforms.CancelEditAction(), silvaforms.EditAction())
class EditTabBlock(silvaforms.RESTPopupForm): grok.adapts(TabBlock, IPage) grok.name('edit') label = u'Edit a slideshow' fields = silvaforms.Fields(ITabFields) actions = silvaforms.Actions(silvaforms.CancelAction(), EditTabBlockAction()) ignoreContent = False def __init__(self, block, context, request, controller, restrictions): super(EditTabBlock, self).__init__(context, request) self.restrictions = restrictions self.block = block self.setContentData(controller)
class CSVSourceEditForm(silvaforms.SMISubForm): """CSVSource Edit Form. """ grok.view(AssetEditTab) grok.order(10) label = _('Edit file content') ignoreContent = False dataManager = silvaforms.SilvaDataManager fields = silvaforms.Fields(ICSVSourceFields).omit('id') fields['file'].fileSetLabel = _( "Click the Upload button to replace the current CSV with a new one.") actions = silvaforms.Actions(silvaforms.CancelEditAction(), silvaforms.EditAction())
class GroupRemoteSettings(silvaforms.SMISubEditForm): grok.context(interfaces.ISilvaSoftwareRemoteGroup) grok.view(Settings) grok.order(4) label = u"Software remote group settings" actions = silvaforms.Actions(silvaforms.SMISubEditForm.actions) fields = silvaforms.Fields(IRemoteGroupFields).omit('id', 'title') @silvaforms.action('Synchronize') def synchronize(self): try: self.context.synchronize(self.request) except ValueError, error: raise silvaforms.ActionError(error.args[0]) self.send_message('Software synchronized.') return silvaforms.SUCCESS
class ImageEditForm(silvaforms.SMISubForm): """ Edit image attributes """ grok.context(IImage) grok.view(AssetEditTab) grok.order(10) label = _('Edit') ignoreContent = False dataManager = silvaforms.SilvaDataManager fields = silvaforms.Fields(IImageAddFields).omit('id') fields['image'].fileSetLabel = _( "Click the Upload button to replace the current image with a new image." ) actions = silvaforms.Actions(silvaforms.CancelEditAction(), silvaforms.EditAction())
class FileEditForm(silvaforms.SMISubForm): """Edit file. """ grok.context(IFile) grok.view(AssetEditTab) grok.order(10) label = _('Edit file content') ignoreContent = False dataManager = silvaforms.SilvaDataManager fields = silvaforms.Fields(IFileAddFields).omit('id') fields['title'].required = False fields['file'].fileSetLabel = _( "Click the Upload button to replace the current file with a new file.") actions = silvaforms.Actions(silvaforms.CancelEditAction(), silvaforms.EditAction())
class SourceAssetEditForm(silvaforms.SMIEditForm): grok.context(ISourceAsset) actions = silvaforms.Actions(silvaforms.CancelEditAction()) readOnly = False def update(self): editable = self.context.get_editable() if editable is not None: self.controller = editable.get_controller(self.request) else: self.controller = self.context.get_viewable().get_controller( self.request) self.readOnly = True def updateWidgets(self): super(SourceAssetEditForm, self).updateWidgets() if self.controller is not None: self.fieldWidgets.extend( self.controller.fieldWidgets(ignoreRequest=self.readOnly, ignoreContent=False, display=self.readOnly)) @property def formErrors(self): if self.controller is not None: return self.controller.formErrors return [] def isEditable(self): return (self.controller is not None and not self.readOnly and self.controller.mode != silvaforms.DISPLAY) @silvaforms.action(_("Save"), available=isEditable, implements=silvaforms.IDefaultAction, accesskey='ctrl+s') def save(self): status = self.controller.save() if status is silvaforms.SUCCESS: self.send_message(_("Changes saved."), type="feedback") return status
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.CancelConfigurationAction()) 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 FileTextEditForm(silvaforms.SMISubForm): """Edit content as a text file. """ grok.context(IFile) grok.view(AssetEditTab) grok.order(20) label = _(u'Edit text content') ignoreContent = False dataManager = silvaforms.SilvaDataManager fields = silvaforms.Fields(IFileTextFields) actions = silvaforms.Actions(silvaforms.CancelEditAction(), silvaforms.EditAction()) def available(self): if self.context.is_text_editable(): try: unicode(self.context.get_text()) return True except (UnicodeDecodeError, TypeError): return False return False
class ImageFormatAndScalingForm(silvaforms.SMISubForm): """ form to resize / change format of image. """ grok.context(IImage) grok.view(AssetEditTab) grok.order(20) ignoreContent = False dataManager = silvaforms.SilvaDataManager label = _('Format and scaling') actions = silvaforms.Actions(silvaforms.CancelEditAction()) fields = silvaforms.Fields(IFormatAndScalingFields) fields['web_format'].mode = 'radio' fields['web_scale'].defaultValue = '100%' @silvaforms.action( title=_('Change'), description=_('Scale and/or crop the image with the new settings'), implements=silvaforms.IDefaultAction) def set_properties(self): data, errors = self.extractData() if errors: return silvaforms.FAILURE try: self.context.set_web_presentation_properties( data.getWithDefault('web_format'), data.getWithDefault('web_scale'), data.getWithDefault('web_crop')) except ValueError as e: self.send_message(e.args[0], type='error') return silvaforms.FAILURE notify(ObjectModifiedEvent(self.context)) self.send_message(_('Scaling and/or format changed.'), type='feedback') return silvaforms.SUCCESS
class SourceAssetAddForm(silvaforms.SMIAddForm): """Add form for a link. """ grok.context(ISourceAsset) grok.name('Silva Source Asset') fields = silvaforms.Fields(ISourceSelectField) titleFields = silvaforms.Fields(ITitledContent) actions = silvaforms.Actions(silvaforms.CancelAddAction()) source = None def publishTraverse(self, request, name): factory = getWrapper(self.context, IExternalSourceManager) try: self.source = factory(request, name=urllib.parse.unquote(name)) except SourceError: parent = super(SourceAssetAddForm, self) return parent.publishTraverse(request, name) self.fields = self.titleFields self.__name__ = '/'.join((self.__name__, name)) return self @property def formErrors(self): if self.source is not None: return self.source.formErrors return [] def updateWidgets(self): super(SourceAssetAddForm, self).updateWidgets() if self.source is not None: self.fieldWidgets.extend( self.source.fieldWidgets(ignoreRequest=False, ignoreContent=True)) @silvaforms.action(_("Select source"), available=lambda form: form.source is None, implements=silvaforms.IDefaultAction, accesskey='ctrl+s') def select_source(self): data, errors = self.extractData() if errors: return silvaforms.FAILURE raise RedirectToPage(sub_tab=data['source'].getId()) @silvaforms.action(_("Save"), available=lambda form: form.source is not None, implements=silvaforms.IDefaultAction, accesskey='ctrl+s') def save(self): data, errors = self.extractData() source_data, source_errors = self.source.extractData() if errors or source_errors: return silvaforms.FAILURE try: content = self._add(self.context, data) except ValueError as error: self.send_message(error.args[0], type="error") return silvaforms.FAILURE editable = content.get_editable() factory = getWrapper(editable, IExternalSourceManager) source = factory(self.request, name=self.source.getSourceId()) source.create() editable.set_parameters_identifier(source.getId()) notify(ObjectModifiedEvent(content)) self.send_message(_("Source Asset added."), type="feedback") raise RedirectToPage(content=content)
class ExternalSourceController(silvaforms.FormData): grok.implements(IExternalSourceController) security = ClassSecurityInfo() actions = silvaforms.Actions() parameterFields = silvaforms.Fields() settingFields = silvaforms.Fields() ignoreRequest = True ignoreContent = False def __init__(self, source, manager, request, instance): dataManager = [ (None, lambda content: silvaforms.FieldValueDataManager(self, content)) ] self.manager = manager self.source = source self.__parent__ = manager.context # Enable security checks. if source is not None: fields = source.get_parameters_form() if fields is not None: self.parameterFields = silvaforms.Fields(fields) # This doesn't work because authentication is not done # when __init__ is called. if checkPermission(SETTINGS_PERMISSION, manager.context): self.settingFields += TextField( identifier="source_template", title="Source template", description= "<!-- source output --> will be replaced by the HTML code generated by the source.", constrainValue=validateSourceTemplate, required=False) dataManager.append( ('source_template', silvaforms.SilvaDataManager)) self.dataManager = silvaforms.MultiDataManagerFactory(dataManager) super(ExternalSourceController, self).__init__(manager.context, request, instance) def getId(self): content = self.getContent() if content is not None: return content.get_parameter_identifier() return None security.declareProtected(permissions.AccessContentsInformation, 'getSourceId') def getSourceId(self): return self.source.id def extractData(self, fields=None): if fields is None: fields = self.parameterFields + self.settingFields return super(ExternalSourceController, self).extractData(fields) def editable(self): return len(self.parameterFields) != 0 @property def label(self): if self.source is not None: return self.source.get_title() return _(u"Broken source") @property def description(self): if self.source is not None: return self.source.get_description() return u'' @property def fields(self): return self.parameterFields def indexes(self): # Return index entries for Silva Indexer. return [] def fulltext(self): # Return fulltext for the catalog return [] def new(self): assert self.source is not None, u'Cannot create broken source' assert self.getContent() is None, u'Cannot override existing source' self.setContentData(self.manager.new(self.source)) return self.getId() def copy(self, destination): assert self.source is not None, u'Cannot copy broken source' assert self.getSourceId() == destination.getSourceId() source = self.getContentData() target = destination.getContentData() for field in self.parameterFields: try: target.set(field.identifier, source.get(field.identifier)) except KeyError: pass @silvaforms.action(_(u"Create")) def create(self): self.new() return self.save() @silvaforms.action(_(u"Save")) def save(self): assert self.getContent() is not None, u'Cannot save to missing source' if self.source is None: raise error.SourceMissingError('unknow') data, errors = self.extractData() if errors: return silvaforms.FAILURE manager = self.getContentData() for field in self.parameterFields + self.settingFields: value = data.getWithDefault(field.identifier) if value is not silvaforms.NO_CHANGE: manager.set(field.identifier, value) return silvaforms.SUCCESS @silvaforms.action(_(u"Remove")) def remove(self): assert self.getContent() is not None, u'Cannot remove missing source' manager = self.getContentData() identifier = self.getId() for field in self.parameterFields: manager.delete(field.identifier) self.manager.remove(identifier) return silvaforms.SUCCESS def fieldWidgets(self, ignoreRequest=False, ignoreContent=True, display=False): if display: self.mode = silvaforms.DISPLAY self.ignoreRequest = True self.ignoreContent = False else: self.mode = silvaforms.INPUT self.ignoreRequest = ignoreRequest self.ignoreContent = ignoreContent widgets = silvaforms.Widgets(form=self, request=self.request) widgets.extend(self.parameterFields) if self.settingFields and not display: widgets.extend(self.settingFields) widgets.update() return widgets security.declareProtected(permissions.AccessContentsInformation, 'render') def render(self, view=False, preview=False): if self.source is None: raise error.SourceMissingError('unknow') if preview and not self.source.is_previewable(): raise error.SourcePreviewError(self) values = {} template = None if self.parameterFields: if not self.ignoreRequest: values, errors = self.extractData(self.parameterFields) if errors: raise error.ParametersError(errors) elif not self.ignoreContent and self.getContent() is not None: template = self.getContent().get_source_template() manager = self.getContentData() for field in self.parameterFields: try: value = manager.get(field.identifier) except KeyError: value = field.getDefaultValue(self) values[field.identifier] = value else: raise error.ParametersError() try: html = self.source.to_html(self.context, self.request, **values) except: info = u''.join(format_exception(*sys.exc_info())) getUtility(ISourceErrors).report(info) raise error.SourceRenderingError(self, info) if not preview and template: html = template.replace('<!-- source output -->', html) return html