class Modern(grok.Viewlet): grok.view(Painting) grok.viewletmanager(Art) def render(self): return u'<p>Mordern art is recent</p>'
class PackageSettings(silvaforms.SMISubEditForm): grok.context(interfaces.ISilvaSoftwarePackage) grok.view(Settings) grok.order(5) label = u"Software package settings" fields = silvaforms.Fields(IPackageSettings)
class Gallery(grok.Viewlet): grok.view(Painting) grok.viewletmanager(Museum) def render(self): return u'<p>A common gallery with rembrandt</p>'
class GroupSettings(silvaforms.SMISubEditForm): grok.context(interfaces.ISilvaSoftwareGroup) grok.view(Settings) grok.order(5) label = u"Software group settings" fields = silvaforms.Fields(IGroupSettings)
class Reserve(grok.Viewlet): grok.view(Painting) grok.viewletmanager(Museum) grok.require('zope2.ViewManagementScreens') def render(self): return u'<p>Non exposed content</p>'
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 ZoomItSnippet(grok.Viewlet): grok.viewletmanager(IAboveContent) grok.context(IZoomItImage) grok.view(IViewView) def available(self): return True def render(self): """Returns a simple marker span""" return '<span id="zoomit-marker" />'
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 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 CheckedOutViewlet(grok.Viewlet): grok.viewletmanager(IAboveContent) grok.context(IDocumentSchema) grok.view(IViewView) grok.require('zope2.View') def update(self): manager = queryMultiAdapter((self.context, self.request), ICheckinCheckoutManager) if not manager: self.available = False elif not manager.checked_out(): self.available = False else: self.available = True info = getUtility(IContactInformation) owner_id = manager.checked_out() self.checkout_owner = info.render_link(owner_id)
class PloneSiteRootView(grok.View): """View for Plone Site Root""" grok.context(IPloneSiteRoot) grok.layer(ITrustTemplateLayer) grok.name('trust-view') grok.require('zope2.View') grok.template('plone-site-root') grok.view(IViewView) def update(self): plone_portal_state = getMultiAdapter((self.context, self.request), name='plone_portal_state') membership = getToolByName(self.context, 'portal_membership') if membership.isAnonymousUser(): url = '{}/login_form'.format(plone_portal_state.portal_url()) self.request.response.redirect(url) elif membership.getHomeFolder(): self.request.response.redirect(membership.getHomeUrl()) else: self.template
class FileServiceConvert(silvaforms.ZMISubForm): grok.context(FilesService) grok.view(FileServiceManagementView) grok.order(20) label = _(u"Convert stored files") description = _(u"Convert all currently stored file to " u"the current set storage.") 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.status = _(u'Storage for Silva Files and Images converted. ' u'Check the log for more details.')
class ManageQuotaRootForm(silvaforms.ZMISubTableForm): grok.context(Application) grok.view(ManageSiteForm) label = _('Manage sites') description = _( 'Modify the space (in MB) allocated to a complete Silva ' 'site. This setting is not modifiable from within the site.') ignoreContent = False batchSize = 25 batchItemFactory = QuotaRootFactory tableFields = silvaforms.Fields(IQuotaRootManager) tableFields['identifier'].mode = silvaforms.DISPLAY tableFields['used'].mode = silvaforms.DISPLAY tableActions = silvaforms.TableActions(SetQuotaAction()) def getItems(self): return self.context.objectValues('Silva Root') def getItemIdentifier(self, item, position): return item.identifier
class CheckedOutViewlet(grok.Viewlet): """A viewlet which shows a statusmessage like message: `This item is being checked out by User XY` when a document is checked out.""" grok.viewletmanager(IAboveContent) grok.context(IDocumentSchema) grok.view(IViewView) grok.require('zope2.View') def update(self): manager = queryMultiAdapter((self.context, self.request), ICheckinCheckoutManager) if not manager: self.available = False elif not manager.get_checked_out_by(): self.available = False else: self.available = True self.checkout_by_link = Actor.user( manager.get_checked_out_by()).get_link()
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 Homepage2Slider(grok.Viewlet): grok.context(IHomepage2) grok.view(Index) grok.viewletmanager(manager.IPortalTop) grok.template('homepage2slider') grok.layer(IProductSpecific) def available(self): return True def slider_items(self): if not self.context.slider_items: return [] return [i.to_object for i in self.context.slider_items] def get_image_tag(self, obj): scales = obj.restrictedTraverse('@@images') image = scales.scale('carousel_image', width=782, height=330) placeholder = '<img src="http://placehold.it/782x330"/>' if not image: return placeholder return image.tag()
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 QuestionInfo(silvaviews.Viewlet): grok.context(IPollQuestion) grok.view(Publish) grok.viewletmanager(silvaforms.SMIFormPortlets) grok.order(40) def available(self): return self.version is not None def update(self): self.version = self.context.get_viewable() if self.version is not None: dates = self.request.locale.dates format = dates.getFormatter('dateTime', 'short').format convert = lambda d: d is not None and format(d) or None self.question_start_datetime = convert( self.version.question_start_datetime()) self.question_end_datetime = convert( self.version.question_end_datetime()) self.result_start_datetime = convert( self.version.result_start_datetime()) self.result_end_datetime = convert( self.version.result_end_datetime())
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 Classic(grok.Viewlet): grok.order(20) grok.view(Painting) grok.viewletmanager(Art)
class Museum(grok.ViewletManager): grok.view(Painting)
class CreateAndDeleteViewlet(grok.Viewlet): grok.context(IContainer) grok.viewletmanager(IAboveContentTitle) grok.view(IViewView)
class Art(grok.ViewletManager): grok.view(Painting) def render(self): return '<p>Art is beautiful</p>'
class Art(grok.ViewletManager): grok.view(Painting)
class TOCRendering(silvaviews.ContentProvider): """Render a toc. """ grok.name('toc') grok.context(Interface) grok.view(Interface) grok.implements(ITOCRenderingOptions) def __init__(self, *args): super(TOCRendering, self).__init__(*args) self.toc_container = None self.toc_depth = -1 self.toc_sort_order = 'silva' self.toc_content_types = None self.toc_show_description = False self.toc_show_icon = False def update(self): if self.toc_container is None: self.toc_container = self.context.get_container() assert IContainer.providedBy(self.toc_container) if self.toc_content_types is None: addables = IAddableContents(self.toc_container) self.toc_content_types = addables.get_container_addables( IPublishable) def list_container_items(self, container, is_displayable): """List the given container items that are a candidates to be listed in the TOC. """ reverse_sort = self.toc_sort_order.startswith('r') items = filter(is_displayable, container.objectValues(self.toc_content_types)) if self.toc_sort_order in ('alpha', 'reversealpha'): items.sort(key=lambda o: o.get_title_or_id(), reverse=reverse_sort) elif self.toc_sort_order in ('silva', 'reversesilva'): # determine silva sorting. # we should only have publishable content items.sort(key=IOrderManager(container).get_position, reverse=reverse_sort) else: # chronologically by modification date items.sort(key=lambda o: o.get_modification_datetime(), reverse=reverse_sort) return items def is_preview_displayable(self, item): """Return true if the item is displayable in preview mode. """ return IPublishable.providedBy(item) and not item.is_default() def is_public_displayable(self, item): """Return true if the item is displayable in public mode. """ return (IPublishable.providedBy(item) and (not item.is_default()) and item.is_published()) def list_toc_items(self, container, level, is_displayable): """Yield for every element in this toc. The 'depth' argument limits the number of levels, defaults to unlimited. """ filter_content = getUtility(IContentFilteringService).filter( self.request) can_recurse = self.toc_depth == -1 or level < self.toc_depth for item in filter_content( self.list_container_items(container, is_displayable)): yield (level, item) if IContainer.providedBy(item) and can_recurse: for data in self.list_toc_items(item, level + 1, is_displayable): yield data def render(self): public = not IPreviewLayer.providedBy(self.request) # XXX This code should be made readable. is_displayable = public and self.is_public_displayable or self.is_preview_displayable html = [] a_templ = '<a href="%s">%s %s</a>' img_tag = '' depth = -1 prev_depth = [-1] gmv = self.context.service_metadata.getMetadataValue item = None get_icon_tag = IIconResolver(self.request).get_tag for (depth, item) in self.list_toc_items(self.toc_container, 0, is_displayable): pd = prev_depth[-1] if pd < depth: #down one level html.append('<ul class="toc">') prev_depth.append(depth) elif pd > depth: #up one level for i in range(pd - depth): prev_depth.pop() html.append('</ul></li>') elif pd == depth: #same level html.append('</li>') html.append('<li>') if self.toc_show_icon: img_tag = get_icon_tag(item) title = (public and item.get_title() or item.get_title_editable()) or item.id html.append( a_templ % (absoluteURL(item, self.request), img_tag, escape(title))) if self.toc_show_description: v = public and item.get_viewable() or item.get_previewable() desc = v and gmv( v, 'silva-extra', 'content_description', acquire=0) if desc: html.append('<p>%s</p>' % desc) else: #do this when the loop is finished, to #ensure that the lists are ended properly #the last item in the list could part of a nested list (with depth 1,2,3+, etc) #so need to loop down the depth and close all open lists while depth >= 0: html.append('</li></ul>') depth -= 1 return u'\n'.join(html)
class Nothing(grok.ViewletManager): grok.view(Painting)
class Modern(grok.Viewlet): grok.order(10) grok.view(Painting) grok.viewletmanager(Art)