def __iter__(self): for item in self.previous: pathkey = self.pathkey(*item.keys())[0] if not pathkey: yield item continue criterionkey = self.criterionkey(*item.keys())[0] if not criterionkey: yield item continue fieldkey = self.fieldkey(*item.keys())[0] if not fieldkey: yield item continue path = item[pathkey] obj = self.context.unrestrictedTraverse( str(path).lstrip('/'), None) if obj is None: # path doesn't exist yield item continue criterion = item[criterionkey] field = item[fieldkey] if IATTopic.providedBy(obj): critid = 'crit__%s_%s' % (field, criterion) if getattr(aq_base(obj), critid, None) is None: obj.addCriterion(field, criterion) item[pathkey] = '%s/%s' % (path, critid) yield item
def query(self, start, limit, contentFilter): """ Make catalog query for the folder listing. @param start: First index to query @param limit: maximum number of items in the batch @param contentFilter: portal_catalog filtering dictionary with index -> value pairs. @return: Products.CMFPlone.PloneBatch.Batch object """ # Batch size b_size = limit # Batch start index, zero based b_start = start # We use different query method, depending on # whether we do listing for topic or folder if IATTopic.providedBy(self.context): # ATTopic like content # Call Products.ATContentTypes.content.topic.ATTopic.queryCatalog() method # This method handles b_start internally and # grabs it from HTTPRequest object return self.context.queryCatalog(contentFilter, batch=True, b_size=b_size) else: # Folder or Large Folder like content # Call CMFPlone(/skins/plone_scripts/getFolderContents Python script # This method handles b_start parametr internally and grabs it from the request object return self.context.getFolderContents(contentFilter, batch=True, b_size=b_size)
def __iter__(self): for item in self.previous: pathkey = self.pathkey(*item.keys())[0] if not pathkey: yield item; continue criterionkey = self.criterionkey(*item.keys())[0] if not criterionkey: yield item; continue fieldkey = self.fieldkey(*item.keys())[0] if not fieldkey: yield item; continue path = item[pathkey] obj = self.context.unrestrictedTraverse(str(path).lstrip('/'), None) if obj is None: # path doesn't exist yield item; continue criterion = item[criterionkey] field = item[fieldkey] if IATTopic.providedBy(obj): critid = 'crit__%s_%s' % (field, criterion) if getattr(aq_base(obj), critid, None) is None: obj.addCriterion(field, criterion) item[pathkey] = '%s/%s' % (path, critid) yield item
def contentsMethod(self): context = aq_inner(self.context) if IATTopic.providedBy(context): contentsMethod = context.queryCatalog else: contentsMethod = context.getFolderContents return contentsMethod
def getCriteriaKeys(self): li = [] if IATTopic.providedBy(self.context) or ICollection.providedBy(self.context) or IDXCollection.providedBy(self.context): criteria = IListBaseQueryCriteria(self.context)() for criterion in [a['i'] for a in criteria]: li.append(self.name+'.'+criterion) return li
def query(self, start, limit, contentFilter): """ Make catalog query for the folder listing. @param start: First index to query @param limit: maximum number of items in the batch @param contentFilter: portal_catalog filtering dictionary with index -> value pairs. @return: Products.CMFPlone.PloneBatch.Batch object """ # Batch size b_size = limit # We use different query method, depending on # whether we do listing for topic or folder if IATTopic.providedBy(self.context) or ICollection.providedBy(self.context): # ATTopic like content # Call Products.ATContentTypes.content.topic.ATTopic.queryCatalog() # method # This method handles b_start internally and # grabs it from HTTPRequest object return self.context.queryCatalog(contentFilter) else: # Folder or Large Folder like content # Call CMFPlone(/skins/plone_scripts/getFolderContents Python # script This method handles b_start parameter internally and grabs # it from the request object return self.context.getFolderContents(contentFilter, batch=True, b_size=b_size)
def getFolderContents(self, contentFilter=None, batch=False, b_size=100, full_objects=False): # logging.getLogger('foo').error('cont hitted') context = self.context mtool = context.portal_membership cur_path = "/".join(context.getPhysicalPath()) path = {} if not contentFilter: contentFilter = {} else: contentFilter = dict(contentFilter) if not contentFilter.get("sort_on", None): contentFilter["sort_on"] = "getObjPositionInParent" if contentFilter.get("path", None) is None: path["query"] = cur_path path["depth"] = 1 contentFilter["path"] = path show_inactive = mtool.checkPermission("Access inactive portal content", context) # Provide batching hints to the catalog b_start = int(context.REQUEST.get("b_start", 0)) # Evaluate in catalog context because # some containers override queryCatalog # with their own unrelated method (Topics) method = context.portal_catalog.queryCatalog if IATTopic.providedBy(self.context): method = self.context.queryCatalog contents = list(method(contentFilter, show_all=1, show_inactive=show_inactive)) if full_objects: contents = [b.getObject() for b in contents] contents.sort(key=comparecustom) if not b_size: b_size = len(contents) if batch: batch = Batch(contents, b_size, b_start, orphan=0) return batch return contents
def _render_cachekey(fun, self): context = aq_inner(self.context) if not self.updated: self.update() if self.calendar.getUseSession(): raise ram.DontCache() else: portal_state = getMultiAdapter((context, self.request), name=u'plone_portal_state') key = StringIO() print >> key, self.data.kw print >> key, portal_state.navigation_root_url() print >> key, cache.get_language(context, self.request) print >> key, self.calendar.getFirstWeekDay() year, month = self.getYearAndMonthToDisplay() print >> key, year print >> key, month navigation_root_path = self.root() start = DateTime('%s/%s/1' % (year, month)) end = DateTime('%s/%s/1 23:59:59' % self.getNextMonth(year, month)) - 1 def add(brain): key.write(brain.getPath()) key.write('\n') key.write(brain.modified) key.write('\n\n') catalog = getToolByName(context, 'portal_catalog') path = navigation_root_path review_state = self.data.review_state or self.calendar.getCalendarStates() options = {} if navigation_root_path: root_content = self.context.restrictedTraverse(navigation_root_path) if IATTopic.providedBy(root_content): options = root_content.buildQuery() if options: # Topic options['start'] = {'query': end, 'range': 'max'} options['end'] = {'query': start, 'range': 'min'} if not options.get('review_state'): options['review_state'] = '' brains = catalog(**options) else: # Folder or site root brains = catalog( portal_type=self.calendar.getCalendarTypes(), start={'query': end, 'range': 'max'}, end={'query': start, 'range': 'min'}, review_state=review_state, path=path) for brain in brains: add(brain) return key.getvalue()
def getResults(self): query = self.getQuery(); b_start = self.request.get('b_start', 0); b_size = 200 if IATTopic.providedBy(self.context): query = self.getQuery() query.update(self.getTopicQuery()) results = self.context.portal_catalog(**query); return Batch(results, b_size, b_start, orphan=0) else: return self.context.results(b_start=b_start, custom_query=query)
def isApplicableCollectionView(view, types): if IATTopic.providedBy(view.context): items = view.context.queryCatalog({'portal_type': types}, batch=True, b_size=3) else: items = view.context.results(b_start=0, b_size=3, custom_query={'portal_type': types}); if (items is not None): for brain in items: if (not brain.portal_type in types): return False return True return False;
def getImages(self): if IATTopic.providedBy(self.context): # ATTopic like content # Call Products.ATContentTypes.content.topic.ATTopic.queryCatalog() method # This method handles b_start internally and # grabs it from HTTPRequest object return self.context.queryCatalog(contentFilter={'portal_type' : 'Image'}, batch=False, b_size=100) else: # Folder or Large Folder like content # Call CMFPlone(/skins/plone_scripts/getFolderContents Python script # This method handles b_start parametr internally and grabs it from the request object return self.context.getFolderContents(contentFilter={'portal_type' : 'Image'}, batch=False, b_size=100)
def results(self): """Get the actual result brains from the collection. It will limit the actual selection to photos. """ results = [] source = self.source iface = "Products.ATContentTypes.interface.image.IPhotoAlbumAble" if source is not None: if IATTopic.providedBy(source): results = source.queryCatalog(object_provides = iface) else: filters = dict(object_provides = iface) results = source.getFolderContents(contentFilter = filters) return results
def videos(self): target = self.target() limit = self.data.limit if target is None: return [] if IRTVideo.providedBy(target): return [ dict(title=target.Title(), description=target.Description(), url=target.absolute_url(), path='/'.join(target.getPhysicalPath()), year=target.getYear(), duration=target.getDuration(), image_url=getImageUrl(target)), ] if IATFolder.providedBy(target): values = [] videos = target.getFolderContents( contentFilter={'object_provides': IRTVideo.__identifier__}) for v in videos: values.append( dict( title=v.Title, description=v.Description, url=v.getURL(), path=v.getPath(), year=v.getYear, duration=v.getDuration, image_url=getImageUrl(v), )) return (limit and values[:limit]) or values if IATTopic.providedBy(target): values = [] videos = target.queryCatalog( contentFilter={'object_provides': IRTVideo.__identifier__}) for v in videos: values.append( dict( title=v.Title, description=v.Description, url=v.getURL(), path=v.getPath(), year=v.getYear, duration=v.getDuration, image_url=getImageUrl(v), )) return (limit and values[:limit]) or values return []
def _contents(self): contents = [] # Collection if IATTopic.providedBy(self.context): try: contents = self.context.queryCatalog(contentFilter={"sort_limit": 6}) except: pass # probably a folder else: contents = self.context.getFolderContents() # Make sure the content is not too big contents = contents[:6] return contents
def _contents(self): contents = [] # Collection if IATTopic.providedBy(self.context): try: contents = self.context.queryCatalog( contentFilter={'sort_limit': 6}) except: pass # probably a folder else: contents = self.context.getFolderContents() # Make sure the content is not too big contents = contents[:6] return contents
def videos(self): target = self.target() limit = self.data.limit if target is None: return [] if IRTVideo.providedBy(target): return [dict(title=target.Title(), description=target.Description(), url=target.absolute_url(), path='/'.join(target.getPhysicalPath()), year=target.getYear(), duration=target.getDuration(), image_url=getImageUrl(target)), ] if IATFolder.providedBy(target): values = [] videos = target.getFolderContents( contentFilter={'object_provides': IRTVideo.__identifier__}) for v in videos: values.append(dict(title = v.Title, description = v.Description, url = v.getURL(), path=v.getPath(), year = v.getYear, duration = v.getDuration, image_url = getImageUrl(v), )) return (limit and values[:limit]) or values if IATTopic.providedBy(target): values = [] videos = target.queryCatalog( contentFilter={'object_provides': IRTVideo.__identifier__}) for v in videos: values.append(dict(title=v.Title, description=v.Description, url=v.getURL(), path=v.getPath(), year=v.getYear, duration=v.getDuration, image_url=getImageUrl(v), )) return (limit and values[:limit]) or values return []
def getFolderContents(self, contentFilter=None, batch=False, b_size=100, full_objects=False): #logging.getLogger('foo').error('cont hitted') context = self.context mtool = context.portal_membership cur_path = '/'.join(context.getPhysicalPath()) path = {} if not contentFilter: contentFilter = {} else: contentFilter = dict(contentFilter) if not contentFilter.get('sort_on', None): contentFilter['sort_on'] = 'getObjPositionInParent' if contentFilter.get('path', None) is None: path['query'] = cur_path path['depth'] = 1 contentFilter['path'] = path show_inactive = mtool.checkPermission('Access inactive portal content', context) # Provide batching hints to the catalog b_start = int(context.REQUEST.get('b_start', 0)) # Evaluate in catalog context because # some containers override queryCatalog # with their own unrelated method (Topics) method = context.portal_catalog.queryCatalog if IATTopic.providedBy(self.context): method = self.context.queryCatalog contents = list( method( contentFilter, show_all=1, show_inactive=show_inactive, )) if full_objects: contents = [b.getObject() for b in contents] contents.sort(key=comparecustom) if not b_size: b_size = len(contents) if batch: batch = Batch(contents, b_size, b_start, orphan=0) return batch return contents
def query_container(self, query, container, depth=1, limit=None, sort_on="getObjPositionInParent"): if 'path' not in query: context_path = '/'.join(container.getPhysicalPath()) query['path'] = {'query': context_path, 'depth': depth, } query['sort_on'] = sort_on query['limit'] = limit if IATTopic.providedBy(container): return container.queryCatalog(query, batch=False, b_size=10, full_objects=False) else: return container.getFolderContents(contentFilter=query, batch=False, b_size=10, full_objects=False)
def getResults(self): context = Acquisition.aq_inner(self.context) if IATTopic.providedBy(context): results = context.queryCatalog() else: catalog = getToolByName(context, 'portal_catalog') if hasattr(catalog, 'getZCatalog'): catalog = catalog.getZCatalog() now = DateTime() queryA = Eq('portal_type', 'News Item') queryBoth = In('review_state', 'published') & Eq('path', '/'.join(context.getPhysicalPath())) \ & Le('effective', now) query = And(queryA, queryBoth) results = catalog.evalAdvancedQuery(query, (('Date', 'desc'),)) return results
def __call__(self): layout = self.context.getLayout() #danger of infinite recursion if layout in recursive_views and (IATTopic.providedBy(self.context) or ICollection.providedBy(self.context)): view = self.context.restrictedTraverse('folder_listing') else: view = self.context.restrictedTraverse(layout) self.request['ajax_load'] = "1" html = view() filtered = filterById(html,'content-core',newclass='template_' + layout) if filtered: return filtered # old styles views return filterById(html,'content',newclass='template_' + layout)
def contents(self): """ Get the contents of the folder/collection. """ context = aq_inner(self.context) settings = NoticeboardSettings(context) display_types = [x for x in settings.display_types] display_types.append(settings.note_type) display_types = list(set(display_types)) if IATTopic.providedBy(context): # handle old collections items = context.queryCatalog(portal_types=display_types) elif ICollection.providedBy(context): # handle new collections items = context.results(batch=False, brains=False) else: # handle folders items = context.getFolderContents(full_objects=True, contentFilter={"portal_type":display_types, "sort_on":"sortable_title"}) return items
def contents(self): """ Get the contents of the folder/collection. """ context = aq_inner(self.context) settings = NoticeboardSettings(context) display_types = [x for x in settings.display_types] display_types.append(settings.note_type) display_types = list(set(display_types)) if IATTopic.providedBy(context): # handle old collections items = context.queryCatalog(portal_types=display_types) elif ICollection.providedBy(context): # handle new collections items = context.results(batch=False, brains=False) else: # handle folders items = context.getFolderContents(full_objects=True, contentFilter={ "portal_type": display_types, "sort_on": "sortable_title" }) return items
def items(self): catalog = getToolByName(self, 'portal_catalog') path = self.context.getPhysicalPath() path = "/".join(path) if IATTopic.providedBy(self.context): items = self.context.queryCatalog() else: sort_on = 'getObjPositionInParent' sort_order = 'ascending' sort_on_field = self.context.getField('sortOn') if sort_on_field and sort_on_field.get(self.context): sort_on = sort_on_field.get(self.context)[0] sort_order_field = self.context.getField('sortOrder') if sort_order_field and sort_order_field.get(self.context): sort_order = sort_order_field.get(self.context)[0] items = catalog.searchResults(path={'query': path, 'depth': 1}, sort_on=sort_on, sort_order=sort_order) b_start = self.request.get('b_start', 0) return Batch(items, 20, int(b_start), orphan=0)
def folderitems(self): """ """ context = aq_inner(self.context) # ATTopic object must come from a catalog, so revert to superclass if IATTopic.providedBy(context): return foldercontents.FolderContentsTable.folderitems.fget(self) results = [] for i, id in enumerate(IFolderContents(context).contentIds()): if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" results.append( LazyDict( self._lazy_dict_func, id=id, table_row_class=table_row_class ) ) return results
def Title(self): context = Acquisition.aq_inner(self.context) if IATTopic.providedBy(context): return context.Title() return _(u"heading_newsboard_latest_news")
def getCriteria(self): if IATTopic.providedBy(self.context) or hasPAC: return IListBaseQueryTopicCriteria(self.context)() return []
def finderResults(self): """Return results to select """ cat = self.data['catalog'] scope = self.data['scope'] if IATTopic.providedBy(scope): supQuery = self.finderQuery() if supQuery.has_key('path'): del supQuery['path'] brains = finderTopicsQueryCatalog(scope, cat, **supQuery) else: query = self.finderQuery() brains = cat(**query) results = [] for b in brains: title_or_id = b.pretty_title_or_id() r = { 'uid': b.UID, 'url': b.getURL(), 'path': b.getPath(), 'title': title_or_id, 'jstitle': title_or_id.replace("\x27", "\x5C\x27"), 'description':b.Description, 'state_class': 'state-%s' % b.review_state, 'is_folderish': b.is_folderish or False, 'size': b.getObjSize, 'type': b.portal_type, 'blacklisted': False, 'created': b.created, 'actions_menu': {} } if r['type'] in self.imagestypes: o = b.getObject() imageInfos = self.getImageInfos(o) orientation = imageInfos[0] width = imageInfos[1] height = imageInfos[2] if width and height: # FIXME: This should go in config.py min, max = 70, 100 if orientation == 'portrait': ratio = float(width)/float(height) if height > max: width = int(ratio *max) height = max if width > min: width = min height = int(min/ratio) else: ratio = float(height)/float(width) if width > max: height = int(ratio *max) width = max if height > min: height = min width = int(min/ratio) thumb_sizes = self.getThumbSizes() # define thumb icon and preview urls for display thumb = icon = '%s/image' % r['url'] preview = '%s/image?isImage=1' % r['url'] for ts in thumb_sizes: if ts[1] >= width and ts[2] >= height: thumb = '%s/image_%s' % (r['url'], ts[0]) break for ts in thumb_sizes: if ts[1] >= 16 and ts[2] >= 16: icon = '%s/image_%s' % (r['url'], ts[0]) break for ts in thumb_sizes: if ts[1] >= 400 and ts[2] >= 400: preview = '%s/image_%s?isImage=1' % (r['url'], ts[0]) break # images sizes actions menu thumb_sizes.extend([('full',width ,height ,_('Full size'), '/image')]) if self.allowimagesizeselection: r['actions_menu']['choose_image_size'] = { 'label': _(u'Choose image size'), 'actions': thumb_sizes } r.update({ 'is_image': True, 'preview_url': preview, 'url': '%s/image' % r['url'], 'container_class': 'imageContainer', 'style': 'width: %ipx; height: %ipx' % (width, height) }) else: orientation = 'small' thumb = icon = None r.update({ 'iconclass': ('contenttype-%s divicon' % b.portal_type.lower().replace(' ','-')), 'is_image': False, 'container_class': 'fileContainer', 'style': '' }) else: # Not an image type orientation = 'small' r['style'] = '' if b.portal_type in self.filestypes: o = b.getObject() icon_base = o.getIcon() if icon_base: r['style'] = 'background-image: url(./%s)' % icon_base r['iconclass'] = 'contenttype-%s divicon' % b.portal_type.lower().replace(' ','-') thumb = icon = None r['is_image'] = False r['container_class'] = 'fileContainer' if self.typeview == 'image': r['orientation_class'] = orientation r['thumb'] = thumb else: r['orientation_class'] = '%s_icon' % orientation r['thumb'] = icon if r['size']: r['real_size'] = float(r['size'].split(' ')[0]) else: r['real_size'] = 0 results.append(r) return results
def getCriteria(self): if IATTopic.providedBy(self.context) or ICollection.providedBy( self.context) or IDXCollection.providedBy(self.context): return IListBaseQueryCriteria(self.context)() return []
def items(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') portal_workflow = getToolByName(context, 'portal_workflow') portal_properties = getToolByName(context, 'portal_properties') portal_types = getToolByName(context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty( 'typesUseViewActionInListings', ()) browser_default = context.browserDefault() if IATTopic.providedBy(context): contentsMethod = context.queryCatalog else: contentsMethod = context.getFolderContents results = [] for i, brain in enumerate(contentsMethod(self.contentFilter)): # don't bother if the object doesn't support bulk-tagging if brain.portal_type not in SUPPORTED_PORTAL_TYPES: continue if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = brain.getURL() path = brain.getPath() or "/".join(brain.getPhysicalPath()) icon = plone_view.getIcon(brain) type_class = 'contenttype-' + plone_utils.normalizeString( brain.portal_type) review_state = brain.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = brain.getURL(relative=True) type_title_msgid = portal_types[brain.portal_type].Title() url_href_title = u'%s: %s' % (translate(type_title_msgid, context=self.request), safe_unicode(brain.Description)) modified = plone_view.toLocalizedTime(brain.ModificationDate, long_format=1) obj_type = brain.Type obj = brain.getObject() if obj_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len( browser_default[1]) == 1 and (brain.id == browser_default[1][0]) subcategory = multilingualthesaurus = nace = "" is_canonical = obj.isCanonical() if not hasattr(self, 'subcategory_field'): self.subcategory_field = obj.getField('subcategory') if getInlineTreeView is not None: subcategory_pt = getInlineTreeView(self.context, brain, self.request, self.subcategory_field) subcategory_mode = (is_canonical or not self.subcategory_field. languageIndependent) and 'edit' or 'view' subcategory = subcategory_pt.render.macros.get( subcategory_mode) if not hasattr(self, 'mt_field'): self.mt_field = obj.getField('multilingual_thesaurus') multilingualthesaurus_pt = getInlineTreeView( self.context, brain, self.request, self.mt_field) multilingualthesaurus_mode = ( is_canonical or not self.mt_field.languageIndependent) and 'edit' or 'view' multilingualthesaurus = multilingualthesaurus_pt.render.macros.get( multilingualthesaurus_mode) if not hasattr(self, 'nace_field'): self.nace_field = obj.getField('nace') nace_pt = getInlineTreeView(self.context, brain, self.request, self.nace_field) nace_mode = (is_canonical or not self.nace_field.languageIndependent ) and 'edit' or 'view' nace = nace_pt.render.macros.get(nace_mode) else: error_msg = "slc.treecategories not available" subcategory = multilingualthesaurus = nace = error_msg subcategory_mode = multilingualthesaurus_mode = nace_mode = \ "view" results.append( dict( url=url, url_href_title=url_href_title, id=brain.getId, quoted_id=urllib.quote_plus(brain.getId), path=path, title_or_id=brain.pretty_title_or_id(), obj_type=obj_type, size=brain.getObjSize, modified=modified, icon=icon.html_tag(), type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj_type), state_class=state_class, is_browser_default=is_browser_default, folderish=brain.is_folderish, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=context.isExpired(brain), subcategory=subcategory, multilingualthesaurus=multilingualthesaurus, nace=nace, subcategory_mode=subcategory_mode, multilingualthesaurus_mode=multilingualthesaurus_mode, nace_mode=nace_mode, context=obj, )) return results
def rootTopic(self): topic = self.context.restrictedTraverse(self.root()) if IATTopic.providedBy(topic): return topic return None
def items(self): """ """ plone_utils = getToolByName(self.context, 'plone_utils') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_properties = getToolByName(self.context, 'portal_properties') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty('typesUseViewActionInListings', ()) browser_default = self.context.browserDefault() if IATTopic.providedBy(self.context): contentsMethod = self.context.queryCatalog else: contentsMethod = self.context.portal_catalog.searchResults results = [] brains = self.context.portal_catalog.searchResults(self.contentFilter) i = 0 for obj in [brain for brain in brains if not getattr(brain.aq_explicit, 'exclude_from_nav', True) and brain.portal_type != 'Course']: if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" if getattr(obj.aq_explicit, 'exclude_from_nav', True): continue url = obj.getURL() path = obj.getPath or "/".join(obj.getPhysicalPath()) icon = plone_view.getIcon(obj); type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = obj.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.getURL(relative=True) obj_type = obj.portal_type modified = plone_view.toLocalizedTime( obj.ModificationDate, long_format=1) if obj_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) results.append(dict( url = url, id = obj.getId, quoted_id = urllib.quote_plus(obj.getId), path = path, title_or_id = obj.pretty_title_or_id(), description = obj.Description, obj_type = obj_type, size = obj.getObjSize, modified = modified, icon = icon.html_tag(), type_class = type_class, wf_state = review_state, state_title = portal_workflow.getTitleForStateOnType(review_state, obj_type), state_class = state_class, is_browser_default = is_browser_default, folderish = obj.is_folderish, relative_url = relative_url, view_url = view_url, table_row_class = table_row_class, is_expired = self.context.isExpired(obj), )) i += 1 return results
def items(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') portal_workflow = getToolByName(context, 'portal_workflow') portal_properties = getToolByName(context, 'portal_properties') portal_types = getToolByName(context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty('typesUseViewActionInListings', ()) browser_default = context.browserDefault() if IATTopic.providedBy(context): contentsMethod = context.queryCatalog else: contentsMethod = context.getFolderContents results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() path = obj.getPath or "/".join(obj.getPhysicalPath()) icon = plone_view.getIcon(obj); type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = obj.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.getURL(relative=True) type_title_msgid = portal_types[obj.portal_type].Title() url_href_title = u'%s: %s' % (translate(type_title_msgid, context=self.request), safe_unicode(obj.Description)) modified = plone_view.toLocalizedTime( obj.ModificationDate, long_format=1) obj_type = obj.Type if obj_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) results.append(dict( url = url, url_href_title = url_href_title, id = obj.getId, quoted_id = urllib.quote_plus(obj.getId), path = path, title_or_id = obj.pretty_title_or_id(), obj_type = obj_type, size = obj.getObjSize, modified = modified, icon = icon.html_tag(), type_class = type_class, wf_state = review_state, state_title = portal_workflow.getTitleForStateOnType(review_state, obj_type), state_class = state_class, is_browser_default = is_browser_default, folderish = obj.is_folderish, relative_url = relative_url, view_url = view_url, table_row_class = table_row_class, is_expired = context.isExpired(obj), )) return results
def finderResults(self): """Return results to select """ cat = self.data['catalog'] scope = self.data['scope'] if IATTopic.providedBy(scope): supQuery = self.finderQuery() if supQuery.has_key('path'): del supQuery['path'] brains = finderTopicsQueryCatalog(scope, cat, **supQuery) else: query = self.finderQuery() brains = cat(**query) results = [] for b in brains: title_or_id = b.pretty_title_or_id() r = { 'uid': b.UID, 'url': b.getURL(), 'path': b.getPath(), 'title': title_or_id, 'jstitle': title_or_id.replace("\x27", "\x5C\x27"), 'description': b.Description, 'state_class': 'state-%s' % b.review_state, 'is_folderish': b.is_folderish or False, 'size': b.getObjSize, 'type': b.portal_type, 'blacklisted': False, 'created': b.created, 'actions_menu': {} } if r['type'] in self.imagestypes: o = b.getObject() imageInfos = self.getImageInfos(o) orientation = imageInfos[0] width = imageInfos[1] height = imageInfos[2] if width and height: # FIXME: This should go in config.py min, max = 70, 100 if orientation == 'portrait': ratio = float(width) / float(height) if height > max: width = int(ratio * max) height = max if width > min: width = min height = int(min / ratio) else: ratio = float(height) / float(width) if width > max: height = int(ratio * max) width = max if height > min: height = min width = int(min / ratio) thumb_sizes = self.getThumbSizes() # define thumb icon and preview urls for display thumb = icon = '%s/image' % r['url'] preview = '%s/image?isImage=1' % r['url'] for ts in thumb_sizes: if ts[1] >= width and ts[2] >= height: thumb = '%s/@@images/image/%s' % (r['url'], ts[0]) break for ts in thumb_sizes: if ts[1] >= 16 and ts[2] >= 16: icon = '%s/@@images/image/%s' % (r['url'], ts[0]) break for ts in thumb_sizes: if ts[1] >= 400 and ts[2] >= 400: preview = '%s/@@images/image/%s?isImage=1' % ( r['url'], ts[0]) break # images sizes actions menu thumb_sizes.extend([('full', width, height, _('Full size'), '/@@images/image')]) if self.allowimagesizeselection: r['actions_menu']['choose_image_size'] = { 'label': _(u'Choose image size'), 'actions': thumb_sizes } r.update({ 'is_image': True, 'preview_url': preview, 'url': '%s/image' % r['url'], 'container_class': 'imageContainer', 'style': 'width: %ipx; height: %ipx' % (width, height) }) else: orientation = 'small' thumb = icon = None r.update({ 'iconclass': ('contenttype-%s divicon' % b.portal_type.lower().replace(' ', '-')), 'is_image': False, 'container_class': 'fileContainer', 'style': '' }) else: # Not an image type orientation = 'small' r['style'] = '' if b.portal_type in self.filestypes: o = b.getObject() icon_base = o.getIcon() if icon_base: r['style'] = 'background-image: url(./%s)' % icon_base r['iconclass'] = 'contenttype-%s divicon' % b.portal_type.lower( ).replace(' ', '-') thumb = icon = None r['is_image'] = False r['container_class'] = 'fileContainer' if self.typeview == 'image': r['orientation_class'] = orientation r['thumb'] = thumb else: r['orientation_class'] = '%s_icon' % orientation r['thumb'] = icon if r['size']: r['real_size'] = float(r['size'].split(' ')[0]) else: r['real_size'] = 0 results.append(r) return results
def items(self): """ """ plone_utils = getToolByName(self.context, 'plone_utils') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_properties = getToolByName(self.context, 'portal_properties') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty('typesUseViewActionInListings', ()) browser_default = self.context.browserDefault() if IATTopic.providedBy(self.context): contentsMethod = self.context.queryCatalog else: contentsMethod = self.context.getFolderContents results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() path = obj.getPath or "/".join(obj.getPhysicalPath()) icon = plone_view.getIcon(obj); type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = obj.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.getURL(relative=True) obj_type = obj.portal_type modified = plone_view.toLocalizedTime( obj.ModificationDate, long_format=1) if obj_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) #Refactor :: determine why ProxyIndex not accessible here if IAnnotations(obj.getObject()).has_key('eduCommons.clearcopyright'): cc_status = IAnnotations(obj.getObject())['eduCommons.clearcopyright'] else: cc_status = False if IAnnotations(obj.getObject()).has_key('eduCommons.accessible'): accessibility_status = IAnnotations(obj.getObject())['eduCommons.accessible'] else: accessibility_status = False results.append(dict( url = url, id = obj.getId, quoted_id = urllib.quote_plus(obj.getId), path = path, title_or_id = obj.pretty_title_or_id(), description = obj.Description, obj_type = obj_type, size = obj.getObjSize, modified = modified, icon = icon.html_tag(), type_class = type_class, wf_state = review_state, state_title = portal_workflow.getTitleForStateOnType(review_state, obj_type), state_class = state_class, is_browser_default = is_browser_default, folderish = obj.is_folderish, relative_url = relative_url, view_url = view_url, table_row_class = table_row_class, is_expired = self.context.isExpired(obj), #Refactor :: determine why ProxyIndex not accessible here cc_status = cc_status, accessibility_status = accessibility_status )) return results
def getCriteria(self): if IATTopic.providedBy(self.context) or ICollection.providedBy(self.context) or IDXCollection.providedBy(self.context): return IListBaseQueryCriteria(self.context)() return []
def items(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') portal_workflow = getToolByName(context, 'portal_workflow') portal_properties = getToolByName(context, 'portal_properties') portal_types = getToolByName(context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty('typesUseViewActionInListings', ()) browser_default = context.browserDefault() if IATTopic.providedBy(context): contentsMethod = context.queryCatalog else: contentsMethod = context.getFolderContents results = [] for i, brain in enumerate(contentsMethod(self.contentFilter)): # don't bother if the object doesn't support bulk-tagging if brain.portal_type not in SUPPORTED_PORTAL_TYPES: continue if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = brain.getURL() path = brain.getPath() or "/".join(brain.getPhysicalPath()) icon = plone_view.getIcon(brain); type_class = 'contenttype-' + plone_utils.normalizeString( brain.portal_type) review_state = brain.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = brain.getURL(relative=True) type_title_msgid = portal_types[brain.portal_type].Title() url_href_title = u'%s: %s' % (translate(type_title_msgid, context=self.request), safe_unicode(brain.Description)) modified = plone_view.toLocalizedTime( brain.ModificationDate, long_format=1) obj_type = brain.Type obj = brain.getObject() if obj_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( brain.id == browser_default[1][0]) subcategory = multilingualthesaurus = nace = "" is_canonical = obj.isCanonical() if not hasattr(self, 'subcategory_field'): self.subcategory_field = obj.getField('subcategory') if getInlineTreeView is not None: subcategory_pt = getInlineTreeView(self.context, brain, self.request, self.subcategory_field) subcategory_mode = (is_canonical or not self.subcategory_field.languageIndependent) and 'edit' or 'view' subcategory = subcategory_pt.render.macros.get(subcategory_mode) if not hasattr(self, 'mt_field'): self.mt_field = obj.getField('multilingual_thesaurus') multilingualthesaurus_pt = getInlineTreeView(self.context, brain, self.request, self.mt_field) multilingualthesaurus_mode = (is_canonical or not self.mt_field.languageIndependent) and 'edit' or 'view' multilingualthesaurus = multilingualthesaurus_pt.render.macros.get(multilingualthesaurus_mode) if not hasattr(self, 'nace_field'): self.nace_field = obj.getField('nace') nace_pt = getInlineTreeView(self.context, brain, self.request, self.nace_field) nace_mode = (is_canonical or not self.nace_field.languageIndependent) and 'edit' or 'view' nace = nace_pt.render.macros.get(nace_mode) else: error_msg = "slc.treecategories not available" subcategory = multilingualthesaurus = nace = error_msg subcategory_mode = multilingualthesaurus_mode = nace_mode = \ "view" results.append(dict( url=url, url_href_title=url_href_title, id=brain.getId, quoted_id=urllib.quote_plus(brain.getId), path=path, title_or_id=brain.pretty_title_or_id(), obj_type=obj_type, size=brain.getObjSize, modified=modified, icon=icon.html_tag(), type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType(review_state, obj_type), state_class=state_class, is_browser_default=is_browser_default, folderish=brain.is_folderish, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=context.isExpired(brain), subcategory=subcategory, multilingualthesaurus=multilingualthesaurus, nace=nace, subcategory_mode=subcategory_mode, multilingualthesaurus_mode=multilingualthesaurus_mode, nace_mode=nace_mode, context=obj, )) return results
def is_topic(self): return IATTopic.providedBy(self.context)
def items(self): """ We override state_class and state_title when returning values for multi-state content. """ context = self.context request = self.request self.context_state = getMultiAdapter((context, request), name='plone_context_state') self.tools = getMultiAdapter((context, request), name='plone_tools') self.workflows = self.tools.workflow().getWorkflowsFor(self.context) plone_utils = getToolByName(self.context, 'plone_utils') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') portal_properties = getToolByName(self.context, 'portal_properties') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty( 'typesUseViewActionInListings', ()) browser_default = self.context.browserDefault() if IATTopic.providedBy(self.context): contentsMethod = self.context.queryCatalog else: contentsMethod = self.context.getFolderContents results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() path = obj.getPath or "/".join(obj.getPhysicalPath()) icon = plone_view.getIcon(obj) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = obj.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.getURL(relative=True) obj_type = obj.portal_type modified = plone_view.toLocalizedTime(obj.ModificationDate, long_format=1) if obj_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len( browser_default[1]) == 1 and (obj.id == browser_default[1][0]) # XXX: This does not get the proper workflow chain when we # are dealing with an item that is under placeful # workflow control. state_list = [] wf_chain = self.tools.workflow().getChainForPortalType(obj_type) for w in wf_chain: wf_obj = self.tools.workflow()[w] state_var = wf_obj.state_var state_id = getattr(obj, state_var, None) wf_states = wf_obj.states # XXX: This is a bit of a hack, if there is a placeful # worklflow in use then this might still be wrong. # Since the state id could be the same in different # workflows. The title it ends up getting might # not be the correct one. if state_id is None or state_id not in wf_states.objectIds(): continue stitle = wf_states[state_id].title state_list.append('<span class="wf-%s state-%s">%s</span>' % (w, state_id, stitle)) # XXX: If the state didn't exist in the workflow chain, # fall back to the `review_state` on the brain. This # Will happen when a placeful workflow is in place # and the workflow chain cannot be determined. if not state_list and isinstance(review_state, basestring): state_list = [review_state] state_string = ', '.join(state_list) results.append( dict( url=url, id=obj.getId, quoted_id=urllib.quote_plus(obj.getId), path=path, title_or_id=obj.pretty_title_or_id(), description=obj.Description, obj_type=obj_type, size=obj.getObjSize, modified=modified, icon=icon.html_tag(), type_class=type_class, wf_state=review_state, state_title=state_string, state_class=state_class, is_browser_default=is_browser_default, folderish=obj.is_folderish, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=self.context.isExpired(obj), )) return results
def finderResults(self): """Return results to select """ cat = self.data["catalog"] scope = self.data["scope"] if IATTopic.providedBy(scope): supQuery = self.finderQuery() if supQuery.has_key("path"): del supQuery["path"] brains = finderTopicsQueryCatalog(scope, cat, **supQuery) else: query = self.finderQuery() brains = cat(**query) results = [] for b in brains: title_or_id = b.pretty_title_or_id() r = { "uid": b.UID, "url": b.getURL(), "path": b.getPath(), "title": title_or_id, "jstitle": title_or_id.replace("\x27", "\x5C\x27"), "description": b.Description, "state_class": "state-%s" % b.review_state, "is_folderish": b.is_folderish or False, "size": b.getObjSize, "type": b.portal_type, "blacklisted": False, "created": b.created, "actions_menu": {}, } if r["type"] in self.imagestypes: o = b.getObject() imageInfos = self.getImageInfos(o) orientation = imageInfos[0] width = imageInfos[1] height = imageInfos[2] if width and height: # FIXME: This should go in config.py min, max = 70, 100 if orientation == "portrait": ratio = float(width) / float(height) if height > max: width = int(ratio * max) height = max if width > min: width = min height = int(min / ratio) else: ratio = float(height) / float(width) if width > max: height = int(ratio * max) width = max if height > min: height = min width = int(min / ratio) thumb_sizes = self.getThumbSizes() # define thumb icon and preview urls for display thumb = icon = "%s/@@images/image" % r["url"] preview = "%s/@@images/image?isImage=1" % r["url"] for ts in thumb_sizes: if ts[1] >= width and ts[2] >= height: thumb = "%s/@@images/image/%s" % (r["url"], ts[0]) break for ts in thumb_sizes: if ts[1] >= 16 and ts[2] >= 16: icon = "%s/@@images/image/%s" % (r["url"], ts[0]) break for ts in thumb_sizes: if ts[1] >= 400 and ts[2] >= 400: preview = "%s/@@images/image/%s?isImage=1" % (r["url"], ts[0]) break # images sizes actions menu thumb_sizes.extend([("full", width, height, _("Full size"), "/image")]) if self.allowimagesizeselection: r["actions_menu"]["choose_image_size"] = { "label": _(u"Choose image size"), "actions": thumb_sizes, } r.update( { "is_image": True, "preview_url": preview, "url": "%s/@@images/image" % r["url"], "container_class": "imageContainer", "style": "width: %ipx; height: %ipx" % (width, height), } ) else: orientation = "small" thumb = icon = None r.update( { "iconclass": ("contenttype-%s divicon" % b.portal_type.lower().replace(" ", "-")), "is_image": False, "container_class": "fileContainer", "style": "", } ) else: # Not an image type orientation = "small" r["style"] = "" if b.portal_type in self.filestypes: o = b.getObject() icon_base = o.getIcon() if icon_base: r["style"] = "background-image: url(./%s)" % icon_base r["iconclass"] = "contenttype-%s divicon" % b.portal_type.lower().replace(" ", "-") thumb = icon = None r["is_image"] = False r["container_class"] = "fileContainer" if self.typeview == "image": r["orientation_class"] = orientation r["thumb"] = thumb else: r["orientation_class"] = "%s_icon" % orientation r["thumb"] = icon if r["size"]: r["real_size"] = float(r["size"].split(" ")[0]) else: r["real_size"] = 0 results.append(r) return results
def items(self): """ We override state_class and state_title when returning values for multi-state content. """ context = self.context request = self.request self.context_state = getMultiAdapter((context, request), name='plone_context_state') self.tools = getMultiAdapter((context, request), name='plone_tools') self.workflows = self.tools.workflow().getWorkflowsFor(self.context) plone_utils = getToolByName(self.context, 'plone_utils') plone_view = getMultiAdapter( (self.context, self.request), name=u'plone') portal_properties = getToolByName(self.context, 'portal_properties') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty( 'typesUseViewActionInListings', ()) browser_default = self.context.browserDefault() if IATTopic.providedBy(self.context): contentsMethod = self.context.queryCatalog else: contentsMethod = self.context.getFolderContents results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() path = obj.getPath or "/".join(obj.getPhysicalPath()) icon = plone_view.getIcon(obj) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = obj.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.getURL(relative=True) obj_type = obj.portal_type modified = plone_view.toLocalizedTime( obj.ModificationDate, long_format=1) if obj_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) # XXX: This does not get the proper workflow chain when we # are dealing with an item that is under placeful # workflow control. state_list = [] wf_chain = self.tools.workflow().getChainForPortalType(obj_type) for w in wf_chain: wf_obj = self.tools.workflow()[w] state_var = wf_obj.state_var state_id = getattr(obj, state_var, None) wf_states = wf_obj.states # XXX: This is a bit of a hack, if there is a placeful # worklflow in use then this might still be wrong. # Since the state id could be the same in different # workflows. The title it ends up getting might # not be the correct one. if state_id is None or state_id not in wf_states.objectIds(): continue stitle = wf_states[state_id].title state_list.append('<span class="wf-%s state-%s">%s</span>' % (w, state_id, stitle)) # XXX: If the state didn't exist in the workflow chain, # fall back to the `review_state` on the brain. This # Will happen when a placeful workflow is in place # and the workflow chain cannot be determined. if not state_list and isinstance(review_state, basestring): state_list = [review_state] state_string = ', '.join(state_list) results.append(dict( url=url, id =obj.getId, quoted_id=urllib.quote_plus(obj.getId), path=path, title_or_id=obj.pretty_title_or_id(), description=obj.Description, obj_type=obj_type, size=obj.getObjSize, modified=modified, icon=icon.html_tag(), type_class=type_class, wf_state=review_state, state_title=state_string, state_class=state_class, is_browser_default=is_browser_default, folderish=obj.is_folderish, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=self.context.isExpired(obj), )) return results