#from zope.component import queryMultiAdapter from zope.interface import implements, alsoProvides, noLongerProvides, Interface from zope.component import adapts, getMultiAdapter from zope.formlib import form from zope.app.form.browser import MultiSelectWidget, TextAreaWidget from Products.Five.formlib import formbase from Products.Five import BrowserView from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from Products.CMFCore.utils import getToolByName from quintagroup.mobileextender import mobileextenderMessageFactory as _ from quintagroup.mobileextender.interfaces import IMobile from interfaces import IMobileConfiglet def SelectWidgetFactory( field, request ): vocabulary = field.value_type.vocabulary return MultiSelectWidget( field, vocabulary, request ) def ListTextAreaWidgetFactory( field, request ): taw = TextAreaWidget( field, request ) taw.width = 20 taw.height = 5 return taw class MobileControl(object): implements(IMobileConfiglet) adapts(Interface) ptypes = [] excludeids = [] wfstates = [] excludepaths = [] def __init__(self, context): self.context = context self.path = getToolByName(context, 'portal_url').getPortalPath() class MobileControlView(formbase.FormBase): """ Configlet settings browser view """ template = ViewPageTemplateFile('mobilecontrol.pt') form_fields = form.Fields(IMobileConfiglet) label = _(u"Define mobile content") form_name = _(u"Define mobile content") description = _(u"This configlet allows you to define content, " \ u"which should be identified as mobile content") form_fields["ptypes"].custom_widget = SelectWidgetFactory form_fields["wfstates"].custom_widget = SelectWidgetFactory form_fields["excludeids"].custom_widget = ListTextAreaWidgetFactory form_fields["excludepaths"].custom_widget = ListTextAreaWidgetFactory form_fields["path"].render_context = True def setUpWidgets(self, ignore_request=False): self.adapters = {} self.adapters[IMobileConfiglet] = MobileControl(self.context) self.widgets = form.setUpWidgets(self.form_fields, self.prefix, self.context, self.request, form=self, adapters=self.adapters, ignore_request=ignore_request) def is_fieldsets(self): # We need to be able to test for non-fieldsets in templates. return False @form.action(_(u"label_mark", default=u"Mark"), name=u'Mark') def handle_mark(self, action, data): res = self.getFilteredContent(data) if res: exclids = data.get('excludeids', '') if exclids: exclids = filter(None, [i.strip() for i in exclids.split('\n')]) res = filter(lambda b:not b.getId in exclids, res) exclpaths = data.get('excludepaths', '') if exclpaths: exclpaths = filter(None, [i.strip() for i in exclpaths.split('\n')]) res = filter(lambda b:not [1 for ep in exclpaths if b.getPath().startswith(ep)], res) # Mark objects with interface marked = 0 for b in res: ob = b.getObject() if not IMobile.providedBy(ob): alsoProvides(ob, IMobile) marked += 1 if marked: catalog = getToolByName(self.context, 'portal_catalog') catalog.manage_reindexIndex(ids=['object_provides']) self.status = "Marked %d objects" % marked else: self.status = "No objects found for given criterion" @form.action(_(u"label_demark", default=u"DeMark"), name=u'DeMark') def handle_demark(self, action, data): res = self.getFilteredContent(data) if res: exclids = data.get('excludeids', '') if exclids: exclids = filter(None, [i.strip() for i in exclids.split('\n')]) res = filter(lambda b:not b.getId in exclids, res) exclpaths = data.get('excludepaths', '') if exclpaths: exclpaths = filter(None, [i.strip() for i in exclpaths.split('\n')]) res = filter(lambda b:not [1 for ep in exclpaths if b.getPath().startswith(ep)], res) # DeMark objects with interface demarked = 0 for b in res: ob = b.getObject() if IMobile.providedBy(ob): noLongerProvides(ob, IMobile) demarked += 1 if demarked: catalog = getToolByName(self.context, 'portal_catalog') catalog.manage_reindexIndex(ids=['object_provides']) self.status = "DeMarked %d objects" % demarked else: self.status = "No objects found for given criterion" def getFilteredContent(self, data): purl = getToolByName(self.context, 'portal_url') catalog = getToolByName(self.context, 'portal_catalog') ptypes = data.get('ptypes',[]) sorton = data.get('sorton',None) wfstates = data.get('wfstates', []) query = {'path' : data.get('path', purl.getPortalPath()),} if ptypes: query.update({'portal_type':ptypes}) if wfstates: query.update({'review_state':wfstates}) return catalog(**query) def currentlyMarked(self): catalog = getToolByName(self.context, 'portal_catalog') return len(catalog(object_provides='quintagroup.mobileextender.interfaces.IMobile'))