def table(self, context, request, sort_on='modified', sort_order="reverse"): pagesize = int(self.request.get('pagesize', 20)) url = context.absolute_url() view_url = url + '/view' table = Table( self.request, url, view_url, self.folderitems(sort_on, sort_order), pagesize=pagesize ) table.render = ViewPageTemplateFile( "browser/templates/reviewfolder_get_table.pt") table.is_secretariat = self.is_secretariat table.question_workflow_map = QUESTION_WORKFLOW_MAP return table
class FolderContentsTable(object): """ The foldercontents table renders the table and its actions. """ def __init__(self, context, request, contentFilter=None): self.context = context self.request = request self.contentFilter = contentFilter is not None and contentFilter or {} self.items = self.folderitems() url = context.absolute_url() view_url = url + '/folder_contents' self.table = Table(request, url, view_url, self.items, show_sort_column=self.show_sort_column, buttons=self.buttons) def render(self): return self.table.render() def contentsMethod(self): context = aq_inner(self.context) if IATTopic.providedBy(context): contentsMethod = context.queryCatalog else: contentsMethod = context.getFolderContents return contentsMethod def folderitems(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') plone_layout = getMultiAdapter((context, self.request), name=u'plone_layout') 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 = plone_utils.browserDefault(context) contentsMethod = self.contentsMethod() show_all = self.request.get('show_all', '').lower() == 'true' pagesize = 20 pagenumber = int(self.request.get('pagenumber', 1)) start = (pagenumber - 1) * pagesize end = start + pagesize results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): path = obj.getPath or "/".join(obj.getPhysicalPath()) # avoid creating unnecessary info for items outside the current # batch; only the path is needed for the "select all" case... # Include brain to make customizations easier (see comment below) if not show_all and not start <= i < end: results.append(dict(path=path, brain=obj)) continue if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() icon = plone_layout.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) fti = portal_types.get(obj.portal_type) if fti is not None: type_title_msgid = fti.Title() else: type_title_msgid = obj.portal_type 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) if obj.portal_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( # provide the brain itself to allow cleaner customisation of # the view. # # this doesn't add any memory overhead, a reference to # the brain is already kept through its getPath bound method. brain = obj, url = url, url_href_title = url_href_title, id = obj.getId, quoted_id = urllib.quote_plus(obj.getId), path = path, title_or_id = safe_unicode(pretty_title_or_id(plone_utils, obj)), 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.portal_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 = isExpired(obj), )) return results @property def orderable(self): """ """ return IOrderedContainer.providedBy(aq_inner(self.context)) @property def show_sort_column(self): return self.orderable and self.editable @property def editable(self): """ """ context_state = getMultiAdapter((aq_inner(self.context), self.request), name=u'plone_context_state') return context_state.is_editable() @property def buttons(self): buttons = [] context = aq_inner(self.context) portal_actions = getToolByName(context, 'portal_actions') button_actions = portal_actions.listActionInfos(object=aq_inner(self.context), categories=('folder_buttons', )) # Do not show buttons if there is no data, unless there is data to be # pasted if not len(self.items): if self.context.cb_dataValid(): for button in button_actions: if button['id'] == 'paste': return [self.setbuttonclass(button)] else: return [] for button in button_actions: # Make proper classes for our buttons if button['id'] != 'paste' or context.cb_dataValid(): buttons.append(self.setbuttonclass(button)) return buttons def setbuttonclass(self, button): if button['id'] == 'paste': button['cssclass'] = 'standalone' else: button['cssclass'] = 'context' return button
class FolderContentsTable(object): """ The foldercontents table renders the table and its actions. """ def __init__(self, context, request, contentFilter=None): self.context = context self.request = request self.contentFilter = contentFilter is not None and contentFilter or {} self.items = self.folderitems() url = context.absolute_url() view_url = url + '/folder_contents' self.table = Table(request, url, view_url, self.items, show_sort_column=self.show_sort_column, buttons=self.buttons) def render(self): return self.table.render() def contentsMethod(self): context = aq_inner(self.context) if IATTopic.providedBy(context): contentsMethod = context.queryCatalog else: contentsMethod = context.getFolderContents return contentsMethod def folderitems(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') plone_layout = getMultiAdapter((context, self.request), name=u'plone_layout') 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 = plone_utils.browserDefault(context) contentsMethod = self.contentsMethod() show_all = self.request.get('show_all', '').lower() == 'true' pagesize = 20 pagenumber = int(self.request.get('pagenumber', 1)) start = (pagenumber - 1) * pagesize end = start + pagesize results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): path = obj.getPath or "/".join(obj.getPhysicalPath()) # avoid creating unnecessary info for items outside the current # batch; only the path is needed for the "select all" case... # Include brain to make customizations easier (see comment below) if not show_all and not start <= i < end: results.append(dict(path=path, brain=obj)) continue if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() icon = plone_layout.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) fti = portal_types.get(obj.portal_type) if fti is not None: type_title_msgid = fti.Title() else: type_title_msgid = obj.portal_type 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) if obj.portal_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( # provide the brain itself to allow cleaner customisation of # the view. # # this doesn't add any memory overhead, a reference to # the brain is already kept through its getPath bound method. brain=obj, url=url, url_href_title=url_href_title, id=obj.getId, quoted_id=urllib.quote_plus(obj.getId), path=path, title_or_id=safe_unicode( pretty_title_or_id(plone_utils, obj)), 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.portal_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=isExpired(obj), )) return results @property def orderable(self): """ """ return IOrderedContainer.providedBy(aq_inner(self.context)) @property def show_sort_column(self): return self.orderable and self.editable @property def editable(self): """ """ context_state = getMultiAdapter((aq_inner(self.context), self.request), name=u'plone_context_state') return context_state.is_editable() @property def buttons(self): buttons = [] context = aq_inner(self.context) portal_actions = getToolByName(context, 'portal_actions') button_actions = portal_actions.listActionInfos( object=aq_inner(self.context), categories=('folder_buttons', )) # Do not show buttons if there is no data, unless there is data to be # pasted if not len(self.items): if self.context.cb_dataValid(): for button in button_actions: if button['id'] == 'paste': return [self.setbuttonclass(button)] else: return [] for button in button_actions: # Make proper classes for our buttons if button['id'] != 'paste' or context.cb_dataValid(): buttons.append(self.setbuttonclass(button)) return buttons def setbuttonclass(self, button): if button['id'] == 'paste': button['cssclass'] = 'standalone' else: button['cssclass'] = 'context' return button
class ReviewListTable(object): """ The review list table renders the table and its actions. """ def __init__(self, context, request, **kwargs): self.context = context self.request = request url = self.context.absolute_url() view_url = url + '/full_review_list' self.table = Table(request, url, view_url, self.items, buttons=self.buttons) def render(self): return self.table.render() @property def items(self): plone_utils = getToolByName(self.context, 'plone_utils') portal_url = getToolByName(self.context, 'portal_url') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') plone_layout = getMultiAdapter((self.context, self.request), name=u'plone_layout') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_types = getToolByName(self.context, 'portal_types') registry = getUtility(IRegistry) use_view_action = registry.get( 'plone.types_use_view_action_in_listings', ()) browser_default = self.context.browserDefault() results = list() for i, obj in enumerate(self.context.my_worklist()): if i % 2 == 0: table_row_class = "even" else: table_row_class = "odd" url = obj.absolute_url() path = '/'.join(obj.getPhysicalPath()) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = portal_workflow.getInfoFor(obj, 'review_state', '') state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = portal_url.getRelativeContentURL(obj) 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())) getMember = getToolByName(obj, 'portal_membership').getMemberById creator_id = obj.Creator() creator = getMember(creator_id) if creator: creator_name = creator.getProperty('fullname', '') or creator_id else: creator_name = creator_id modified = ''.join(map(safe_unicode, [ creator_name, ' - ', plone_view.toLocalizedTime(obj.ModificationDate(), long_format=1)])) is_structural_folder = obj.restrictedTraverse( '@@plone').isStructuralFolder() if obj.portal_type in use_view_action: view_url = url + '/view' elif is_structural_folder: 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(), description=obj.Description(), obj_type=obj.Type, size=obj.getObjSize(), modified=modified, type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj.portal_type), state_class=state_class, is_browser_default=is_browser_default, folderish=is_structural_folder, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=self.context.isExpired(obj) )) return results @property def show_sort_column(self): return False def buttons(self): buttons = [] portal_actions = getToolByName(self.context, 'portal_actions') button_actions = portal_actions.listActionInfos( object=aq_inner(self.context), categories=('folder_buttons', )) # Do not show buttons if there is no data, unless there is data to be # pasted if False: # not len(self.batch): if self.context.cb_dataValid(): for button in button_actions: if button['id'] == 'paste': return [self.setbuttonclass(button)] else: return [] for button in button_actions: # Make proper classes for our buttons if button['id'] != 'paste' or self.context.cb_dataValid(): buttons.append(self.setbuttonclass(button)) return buttons def setbuttonclass(self, button): if button['id'] == 'paste': button['cssclass'] = 'standalone' else: button['cssclass'] = 'context' return button
class ReviewListTable(object): """ The review list table renders the table and its actions. """ def __init__(self, context, request, **kwargs): self.context = context self.request = request url = self.context.absolute_url() view_url = url + '/full_review_list' self.table = Table(request, url, view_url, self.items, buttons=self.buttons) def render(self): return self.table.render() @property def items(self): plone_utils = getToolByName(self.context, 'plone_utils') portal_url = getToolByName(self.context, 'portal_url') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') plone_layout = getMultiAdapter((self.context, self.request), name=u'plone_layout') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_types = getToolByName(self.context, 'portal_types') registry = getUtility(IRegistry) use_view_action = registry.get( 'plone.types_use_view_action_in_listings', ()) browser_default = self.context.browserDefault() results = list() for i, obj in enumerate(self.context.my_worklist()): if i % 2 == 0: table_row_class = "even" else: table_row_class = "odd" url = obj.absolute_url() path = '/'.join(obj.getPhysicalPath()) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = portal_workflow.getInfoFor(obj, 'review_state', '') state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = portal_url.getRelativeContentURL(obj) 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())) getMember = getToolByName(obj, 'portal_membership').getMemberById creator_id = obj.Creator() creator = getMember(creator_id) if creator: creator_name = creator.getProperty('fullname', '') or creator_id else: creator_name = creator_id modified = creator_name + ' - ' + plone_view.toLocalizedTime( obj.ModificationDate(), long_format=1) is_structural_folder = obj.restrictedTraverse( '@@plone').isStructuralFolder() if obj.portal_type in use_view_action: view_url = url + '/view' elif is_structural_folder: 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(), description=obj.Description(), obj_type=obj.Type, size=obj.getObjSize(), modified=modified, type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj.portal_type), state_class=state_class, is_browser_default=is_browser_default, folderish=is_structural_folder, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=self.context.isExpired(obj))) return results @property def show_sort_column(self): return False def buttons(self): buttons = [] portal_actions = getToolByName(self.context, 'portal_actions') button_actions = portal_actions.listActionInfos( object=aq_inner(self.context), categories=('folder_buttons', )) # Do not show buttons if there is no data, unless there is data to be # pasted if False: # not len(self.batch): if self.context.cb_dataValid(): for button in button_actions: if button['id'] == 'paste': return [self.setbuttonclass(button)] else: return [] for button in button_actions: # Make proper classes for our buttons if button['id'] != 'paste' or self.context.cb_dataValid(): buttons.append(self.setbuttonclass(button)) return buttons def setbuttonclass(self, button): if button['id'] == 'paste': button['cssclass'] = 'standalone' else: button['cssclass'] = 'context' return button
class ReviewListTable(object): """ The review list table renders the table and its actions. """ def __init__(self, context, request, **kwargs): self.context = context self.request = request url = self.context.absolute_url() view_url = url + '/full_review_list' self.table = Table(request, url, view_url, self.items, buttons=self.buttons) def render(self): return self.table.render() @property def items(self): catalog = getToolByName(self.context, 'portal_catalog') plone_utils = getToolByName(self.context, 'plone_utils') portal_url = getToolByName(self.context, 'portal_url') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_properties = getToolByName(self.context, 'portal_properties') portal_types = getToolByName(self.context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty( 'typesUseViewActionInListings', ()) browser_default = self.context.browserDefault() results = list() brains = catalog(review_state='pending', sort_order='created') for i, obj in enumerate(brains): if i % 2 == 0: table_row_class = "even" else: table_row_class = "odd" url = obj.getURL() path = obj.getPath() icon = obj.getIcon icon_tag = '<img width="16" height="16" src="{}/{}" />' icon_tag = icon_tag.format(portal_url(), icon) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = 'Pending review' state_class = 'state-' + plone_utils.normalizeString(review_state) #relative_url = portal_url.getRelativeContentURL(obj) 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.modified, long_format=1) is_structural_folder = False if obj.portal_type in use_view_action: view_url = url + '/view' elif is_structural_folder: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len( browser_default[1]) == 1 and (obj.getId == 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.Title, description=obj.Description, obj_type=obj.Type, size=obj.getObjSize, modified=modified, icon=icon_tag, type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj.portal_type), state_class=state_class, is_browser_default=is_browser_default, folderish=is_structural_folder, relative_url='', view_url=view_url, table_row_class=table_row_class, is_expired=False)) return results @property def show_sort_column(self): return False def buttons(self): buttons = [] portal_actions = getToolByName(self.context, 'portal_actions') button_actions = portal_actions.listActionInfos( object=aq_inner(self.context), categories=('folder_buttons', )) # Do not show buttons if there is no data, unless there is data to be # pasted if False: # not len(self.batch): if self.context.cb_dataValid(): for button in button_actions: if button['id'] == 'paste': return [self.setbuttonclass(button)] else: return [] for button in button_actions: # Make proper classes for our buttons if button['id'] != 'paste' or self.context.cb_dataValid(): buttons.append(self.setbuttonclass(button)) return buttons def setbuttonclass(self, button): if button['id'] == 'paste': button['cssclass'] = 'standalone' else: button['cssclass'] = 'context' return button
class ReviewListTable(object): """ The review list table renders the table and its actions. """ def __init__(self, context, request, **kwargs): self.context = context self.request = request url = self.context.absolute_url() view_url = url + '/full_review_list' self.table = Table(request, url, view_url, self.items, buttons=self.buttons) def render(self): return self.table.render() @property def items(self): catalog = getToolByName(self.context, 'portal_catalog') plone_utils = getToolByName(self.context, 'plone_utils') portal_url = getToolByName(self.context, 'portal_url') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_properties = getToolByName(self.context, 'portal_properties') portal_types = getToolByName(self.context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty( 'typesUseViewActionInListings', ()) browser_default = self.context.browserDefault() results = list() brains = catalog(review_state='pending', sort_order='created') for i, obj in enumerate(brains): if i % 2 == 0: table_row_class = "even" else: table_row_class = "odd" url = obj.getURL() path = obj.getPath() icon = obj.getIcon icon_tag = '<img width="16" height="16" src="{}/{}" />' icon_tag = icon_tag.format(portal_url(), icon) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = 'Pending review' state_class = 'state-' + plone_utils.normalizeString(review_state) #relative_url = portal_url.getRelativeContentURL(obj) 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.modified, long_format=1) is_structural_folder = False if obj.portal_type in use_view_action: view_url = url + '/view' elif is_structural_folder: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.getId == 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.Title, description=obj.Description, obj_type=obj.Type, size=obj.getObjSize, modified=modified, icon=icon_tag, type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj.portal_type), state_class=state_class, is_browser_default=is_browser_default, folderish=is_structural_folder, relative_url='', view_url=view_url, table_row_class=table_row_class, is_expired=False )) return results @property def show_sort_column(self): return False def buttons(self): buttons = [] portal_actions = getToolByName(self.context, 'portal_actions') button_actions = portal_actions.listActionInfos( object=aq_inner(self.context), categories=('folder_buttons',)) # Do not show buttons if there is no data, unless there is data to be # pasted if False: # not len(self.batch): if self.context.cb_dataValid(): for button in button_actions: if button['id'] == 'paste': return [self.setbuttonclass(button)] else: return [] for button in button_actions: # Make proper classes for our buttons if button['id'] != 'paste' or self.context.cb_dataValid(): buttons.append(self.setbuttonclass(button)) return buttons def setbuttonclass(self, button): if button['id'] == 'paste': button['cssclass'] = 'standalone' else: button['cssclass'] = 'context' return button
class FolderContentsTable(object): """ The foldercontents table renders the table and its actions. """ def __init__(self, context, request, contentFilter={}): self.context = context self.request = request self.contentFilter = contentFilter url = context.absolute_url() view_url = url + '/@@folder_contents' self.table = Table(request, url, view_url, self.items, show_sort_column=self.show_sort_column, buttons=self.buttons) def render(self): return self.table.render() @property @instance.memoize 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 @property def orderable(self): """ """ return IOrderedContainer.providedBy(aq_inner(self.context)) @property def show_sort_column(self): return self.orderable and self.editable @property def editable(self): """ """ context_state = getMultiAdapter((aq_inner(self.context), self.request), name=u'plone_context_state') return context_state.is_editable() @property def buttons(self): buttons = [] context = aq_inner(self.context) portal_actions = getToolByName(context, 'portal_actions') button_actions = portal_actions.listActionInfos(object=context, categories=('folder_buttons', )) # Do not show buttons if there is no data, unless there is data to be # pasted if not len(self.items): for button in button_actions: # Add Import button to available actions in empty folders if button['id'] == 'import': buttons.append(self.setbuttonclass(button)) if self.context.cb_dataValid(): for button in button_actions: if button['id'] == 'paste': buttons.append(self.setbuttonclass(button)) return buttons else: return buttons for button in button_actions: # Make proper classes for our buttons if button['id'] != 'paste' or context.cb_dataValid(): buttons.append(self.setbuttonclass(button)) return buttons def setbuttonclass(self, button): if button['id'] == 'paste': button['cssclass'] = 'standalone' else: button['cssclass'] = 'context' return button