class ActivityAggregatorAddForm(silvaforms.SMIAddForm): grok.name('Silva Software Activity Aggregator') grok.context(SilvaSoftwareActivityAggregator) fields = silvaforms.Fields(ITitledContent) fields['id'].defaultValue = id_default_value fields['title'].defaultValue = title_default_value
class ContactForm(silvaforms.PublicForm): """Contact form. """ grok.name('contact.html') grok.context(IContainer) label = _(u'Contact') description = _(u'You can contact the Community Manager with this form.') fields = silvaforms.Fields(IContactFields) @silvaforms.action(_(u"Contact us!"), identifier='contact', accesskey='c') def contact(self): data, errors = self.extractData() if errors: self.status = _(u'Please correct the errors.') return silvaforms.FAILURE sendmail(self.context, TEMPLATE.format(**data.getDictWithDefault()), mto='*****@*****.**', mfrom='*****@*****.**', subject='Contact request from silvacms.org') success = self.context.get_root()._getOb('success', None) if success is not None: self.response.redirect(absoluteURL(success, self.request)) else: self.status = _(u'Thank you for your message.') return silvaforms.SUCCESS
class GroupSettings(silvaforms.SMISubEditForm): grok.context(interfaces.ISilvaSoftwareGroup) grok.view(Settings) grok.order(5) label = u"Software group settings" fields = silvaforms.Fields(IGroupSettings)
class PartialUpgradesForm(silvaforms.ZMIForm): """From to partially upgrade a site. TO USE ONLY if you known what you are doing. """ grok.name('manage_partialUpgrade') fields = silvaforms.Fields(IPartialUpgrade) label = _(u"Upgrade site") description = _(u"Below you find a form that allows you to specify " u"an object to upgrade, and which version the object " u"is in now. When you enter values in those fields and " u"press the 'upgrade' button, Silva will try to upgrade " u"the object to get it in proper shape for the current " u"Silva version. Note that this functionality is " u"experimental, and it is known that performing a " u"partial upgrade on an object may fail and may " u"even (in some situations) cause the object to " u"become unusable.") @silvaforms.action(_("Upgrade")) def upgrade(self): data, errors = self.extractData() if errors: return path, version = data["path"], data["version"] root = self.context.get_root() # If path is an unicode string it need to be encoded. path = path.encode('utf-8') content = root.restrictedTraverse(path) self.context.upgrade_content(content, version, root.get_silva_software_version()) self.status = _( u"Content upgrade succeeded. See event log for details")
class CloudForm(silvaforms.PublicForm): """Cloud form. """ grok.name('cloud.html') grok.context(IContainer) label = _(u'Cloud instance') description = _(u"""You can request a cloud site using this form. The site will usually be setup in less than a business day. Once it is done you'll be sent a URL, e.g.: http://subdomain.cloud.silvacms.org, a user and password to access your site. Then you'll have your own Silva sandbox and you can give Silva an extensive test drive. There is no guarantee of service on this hosting.""") fields = silvaforms.Fields(IContactFields) @silvaforms.action(_(u"Get your cloud instance!"), identifier='cloud', accesskey='c') def cloud(self): data, errors = self.extractData() if errors: self.status = _(u'Please correct the errors.') return silvaforms.FAILURE sendmail(self.context, TEMPLATE.format(**data.getDictWithDefault()), mto='*****@*****.**', mfrom='*****@*****.**', subject='Cloud instance request from silvacms.org') self.response.redirect( absoluteURL(self.context, self.request) + '/cloud-booked.html') return silvaforms.SUCCESS
class CSVSourceAddForm(silvaforms.SMIAddForm): """CSVSource Add Form. """ grok.context(ICSVSource) grok.name('Silva CSV Source') fields = silvaforms.Fields(ICSVSourceFields)
class PollQuestionAddForm(silvaforms.SMIAddForm): """Poll Question Add Form """ grok.context(IPollQuestion) grok.name(u"Silva Poll Question") fields = silvaforms.Fields(IPollQuestionFields)
class CommentAddForm(silvaforms.SMIAddForm): """Comment Add Form. """ grok.context(IComment) grok.name('Silva Forum Comment') fields = silvaforms.Fields(ICommentSchema)
class PackageSettings(silvaforms.SMISubEditForm): grok.context(interfaces.ISilvaSoftwarePackage) grok.view(Settings) grok.order(5) label = u"Software package settings" fields = silvaforms.Fields(IPackageSettings)
class AutoTOCAddForm(silvaforms.SMIAddForm): """Add an Auto TOC. """ grok.context(IAutoTOC) grok.name('Silva AutoTOC') fields = silvaforms.Fields(IAutoTOCSchema)
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)
class LinkEditForm(silvaforms.SMIEditForm): """Edit form for a link. """ grok.context(interfaces.ILink) fields = silvaforms.Fields(ILinkSchema).omit('id') fields['target'].referenceNotSetLabel = _( u"Click the Lookup button to select an item to refer to.")
class ActivityAggregatorEditForm(silvaforms.SMIEditForm): grok.context(SilvaSoftwareActivityAggregator) actions = silvaforms.SMIEditForm.actions.copy() fields = silvaforms.Fields(ITitledContent).omit('id') @silvaforms.action('Refresh') def refresh(self): self.context.refresh()
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 LinkAddForm(silvaforms.SMIAddForm): """Add form for a link. """ grok.context(interfaces.ILink) grok.name(u'Silva Link') fields = silvaforms.Fields(ILinkSchema) fields['target'].referenceNotSetLabel = _( u"Click the Lookup button to select an item to refer to.")
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 GhostFolderEditForm(silvaforms.SMIEditForm): """ Edit form Ghost Folder """ grok.context(IGhostFolder) grok.name('edit') fields = silvaforms.Fields(IGhostFolderSchema).omit('id') dataValidators = [TargetValidator('haunted', IContainer, adding=False)] actions = silvaforms.SMIEditForm.actions + SyncAction(_('Synchronize'))
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 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 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 ZopeWelcomePage(silvaforms.ZMIForm): grok.context(Application) grok.name('index.html') grok.require('zope2.Public') fields = silvaforms.Fields(ISilvaRootAddFields) def update(self): self.sites = self.context.objectValues('Silva Root') self.is_dev = Globals.DevelopmentMode self.version = extensionRegistry.get_extension('Silva').version def is_manager(self): return getSecurityManager().checkPermission('View Management Screens', self.context) @silvaforms.action(_("Authenticate first to add a new site"), identifier='login', available=lambda form: not form.is_manager()) def login(self): if not self.is_manager(): raise Unauthorized("You must authenticate to add a new Silva Site") @silvaforms.action(_("Add a new site"), identifier='add_site', available=lambda form: form.is_manager()) def add_site(self): data, errors = self.extractData() if errors: return silvaforms.FAILURE self.context.manage_addProduct['Silva'].manage_addRoot( data['identifier'], data.getDefault('title')) root = self.context._getOb(data['identifier']) getUtility(IMessageService).send( _("New Silva site ${identifier} added.", mapping={'identifier': data['identifier']}), self.request) if data.getDefault('add_search'): # install a silva find instance factory = root.manage_addProduct['SilvaFind'] factory.manage_addSilvaFind('search', 'Search this site') if data.getDefault('add_documentation'): transaction.commit() # Be sure everything in the site is # in the DB before. install the user # documentation .zexp install_documentation(root, self.request) self.redirect(absoluteURL(root, self.request) + '/edit') return silvaforms.SUCCESS
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 FolderAddForm(silvaforms.SMIAddForm): """Add form for a Folder. """ grok.context(IFolder) grok.name(u'Silva Folder') fields = silvaforms.Fields(IContainerSchema) # Prevent to call a folder index. fields['id'].validateForInterface = IFolder def _edit(self, parent, content, data): policies = getUtility(IContainerPolicyService) policy = policies.get_policy(data['default_item']) policy.createDefaultDocument(content, data['title'])
class ManageExportCodeSources(silvaforms.ZMIForm): grok.name('manage_export_codesources') grok.context(IContainer) label = u'Mass export of codesources' description = u'Export every codesources located in this container and ' \ u'optionally in sub-containers.' fields = silvaforms.Fields(IExportCodeSourcesFields) @silvaforms.action('Export') def export(self): values, errors = self.extractData() if errors: return silvaforms.FAILURE exported = [] extension_name = values['extension_name'] if ':' in extension_name: extension_name, entry_name = extension_name.split(':', 1) extension = pkg_resources.working_set.by_key[extension_name] directory = os.path.dirname( extension.load_entry_point('Products.SilvaExternalSources.sources', entry_name).__file__) if values['recursive']: sources = walk_silva_tree(self.context, requires=ICodeSource) else: sources = self.context.objectValues('Silva Code Source') for source in sources: if source.meta_type != 'Silva Code Source': continue identifier = source.getId() target = os.path.join(directory, identifier) location = (extension.project_name + ':' + target[len(extension.location):]) if source.get_fs_location() not in (None, location): continue if not os.path.exists(target): os.makedirs(target) source._fs_location = location installable = CodeSourceInstallable(location, target) installable.export(source) exported.append(location) if exported: self.status = 'Exported: {0}.'.format(', '.join(exported)) else: self.status = 'Nothing exported.' return silvaforms.SUCCESS
class GhostAssetAddForm(silvaforms.SMIAddForm): """ Add form for ghost folders """ grok.name(u'Silva Ghost Asset') fields = silvaforms.Fields(IGhostAssetSchema) fields['haunted'].referenceNotSetLabel = _( u"Click the Lookup button to select an asset to haunt.") dataValidators = [TargetValidator('haunted', IAsset, adding=True)] def _add(self, parent, data): factory = parent.manage_addProduct['Silva'] return factory.manage_addGhostAsset(data['id'], None, haunted=data['haunted'])
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 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 MailThatPage(silvaforms.PublicForm): grok.name('mailthatpage.html') grok.context(ISilvaObject) fields = silvaforms.Fields(IMailForm) label = _(u"Send this page by mail") def __call__(self): interface.alsoProvides(self.request, INonCachedLayer) return super(MailThatPage, self).__call__() @silvaforms.action(_(u"Send")) def send(self): data, errors = self.extractData() if errors: self.status = _(u"Please correct the errors.") return silvaforms.FAILURE metadata = interfaces.IMetadata(self.context.get_root()) mail_template = metadata('mail-pageactions', 'mail-body') mail_from = metadata('mail-pageactions', 'mail-from') if (not mail_from) or (not mail_template): self.status = _(u"Mail settings are not configured, " "can't send mail at the moment.") return silvaforms.FAILURE url = absoluteURL(self.context, self.request) body = mail_template % {'title': self.context.get_title(), 'url': url} pdf = component.getMultiAdapter((self.context, self.request), name="index.pdf").pdf() message = MIMEMultipart() message['Subject'] = data['subject'] message['To'] = data['to'] message['Form'] = mail_from message.attach(MIMEText(body, 'plain', 'UTF-8')) message.attach(MIMEPdf(pdf, self.context.getId())) try: sendmail(self.context, message.as_string(), data['to'], mail_from, data['subject']) except SMTPException, e: self.status = str(e) else:
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