1: from Acquisition import aq_inner
1: from zope.formlib import form
1: from zope.interface import implements
1: from zope import schema
1: from zope.component import getMultiAdapter
1: from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
1: from Products.CMFCore.utils import getToolByName
1: from Products.CMFPlone.utils import safe_unicode
1: from plone.memoize.instance import memoize
1: from plone.portlets.interfaces import IPortletDataProvider
1: from plone.app.portlets.portlets import base
1: from vnccollab.theme import messageFactory as _
2: class IUsersBoxPortlet(IPortletDataProvider):
1: header = schema.TextLine(
1: title=_(u"Header"),
1: description=_(u"Header of the portlet."),
1: required=False,
1: default=u'Users')
1: do_not_recurse = schema.Bool(
1: title=_(u"Do not fetch users recursively"),
1: description=_(u"By default portlet displays all users that contributed "
"to content under current container. If this option "
"ticked, only current context object contributors will "
"be shown."),
1: required=False,
1: default=False)
1: count = schema.Int(
1: title=_(u"Number of items to display"),
1: description=u'',
1: required=True,
1: default=30)
2: class Assignment(base.Assignment):
1: implements(IUsersBoxPortlet)
1: header = u'Users'
1: do_not_recurse = False
1: count = 30
1: @property
def title(self):
"""Return portlet header"""
>>>>>> return self.header or _(u"Users Box")
1: def __init__(self, header=u'Users', do_not_recurse=False, count=30):
>>>>>> self.header = header
>>>>>> self.do_not_recurse = do_not_recurse
>>>>>> self.count = count
2: class Renderer(base.Renderer):
1: render = ZopeTwoPageTemplateFile('templates/users_box.pt')
1: @property
def available(self):
>>>>>> return len(self._getUsers()) > 0
1: def update(self):
>>>>>> self.users = self._getUsers()
1: @memoize
def _getUsers(self):
>>>>>> if not self.data.count:
>>>>>> return ()
>>>>>> users = []
>>>>>> context = aq_inner(self.context)
>>>>>> catalog = getToolByName(context, 'portal_catalog')
>>>>>> acl_users = getToolByName(context, 'acl_users')
>>>>>> mtool = getToolByName(context, 'portal_membership')
>>>>>> cstate = getMultiAdapter((self.context, self.request),
>>>>>> name='plone_context_state')
# prepare catalog query
>>>>>> query = {'sort_on': 'modified',
>>>>>> 'sort_order': 'reverse'}
>>>>>> path = '/'.join(cstate.folder().getPhysicalPath())
>>>>>> if self.data.do_not_recurse:
>>>>>> query['path'] = {'query': path, 'depth': 0}
else:
>>>>>> query['path'] = path
>>>>>> added = []
>>>>>> invalid = []
>>>>>> purl = getToolByName(context, 'portal_url')()
>>>>>> limit = self.data.count
>>>>>> counter = 0
>>>>>> for brain in catalog(**query):
# already got enough users
>>>>>> if counter >= limit:
>>>>>> break
>>>>>> creator = brain.Creator
# skip duplicates
>>>>>> if not creator or creator in added or creator in invalid:
>>>>>> continue
# check if user exists and whether user got profile image
>>>>>> user = acl_users.getUserById(creator)
>>>>>> if user is None:
>>>>>> invalid.append(creator)
>>>>>> continue
# finally append user and increment counters
>>>>>> users.append({
>>>>>> 'id': creator,
>>>>>> 'img': mtool.getPersonalPortrait(id=creator),
>>>>>> 'url': '%s/author/%s' % (purl, creator),
>>>>>> 'fullname': user.getProperty("fullname"),
>>>>>> 'email': user.getProperty("email")
})
>>>>>> added.append(creator)
>>>>>> counter += 1
>>>>>> return tuple(users)
2: class AddForm(base.AddForm):
1: form_fields = form.Fields(IUsersBoxPortlet)
1: label = _(u"Add Users Box Portlet")
1: description = _(u"A portlet which lists users contributed to current "
"container.")
1: def create(self, data):
>>>>>> return Assignment(**data)
2: class EditForm(base.EditForm):
1: form_fields = form.Fields(IUsersBoxPortlet)
1: label = _(u"Edit Users Box Portlet")
1: description = _(u"A portlet which lists users contributed to current "
"container.")