source: products/quintagroup.quills.extras/trunk/quintagroup/quills/extras/portlets/bloggers.py @ 1581

Last change on this file since 1581 was 1577, checked in by fenix, 14 years ago

added bloggers portlet

  • Property svn:executable set to *
File size: 4.5 KB
Line 
1from zope import schema
2from zope.formlib import form
3from zope.interface import implements
4from zope.component.interface import interfaceToName
5from zope.component import getMultiAdapter
6
7from plone.app.portlets.portlets import base
8from plone.portlets.interfaces import IPortletDataProvider
9
10from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
11from Products.CMFCore.utils import getToolByName
12from plone.memoize.instance import memoize
13
14# Quills imports
15from quills.core.interfaces import IBaseContent
16from quills.core.interfaces import IWeblogEnhanced
17from quills.core.interfaces import IWeblog
18from quills.app.utilities import recurseToInterface
19from quills.app import QuillsAppMessageFactory as _
20from quills.core.interfaces import IPossibleWeblogEntry
21
22# Local imports
23from quills.app.portlets.base import BasePortletRenderer
24
25
26PORTLET_TITLE = _(u"Bloggers")
27PORTLET_DESC = _(u"This portlet lists weblog authors.")
28
29
30class IBloggersPortlet(IPortletDataProvider):
31
32    blog_path = schema.TextLine(
33        title=_(u"Path to Blog"),
34        description=_(u"Physical path to blog, from the plone object, 'blog' for ex."),
35        required=True)
36
37class Assignment(base.Assignment):
38
39    implements(IBloggersPortlet)
40
41    def __init__(self, blog_path='/blog'):
42        self.blog_path = blog_path
43
44    @property
45    def title(self):
46        return PORTLET_TITLE
47
48
49class Renderer(BasePortletRenderer, base.Renderer):
50
51    _template = ViewPageTemplateFile('bloggers.pt')
52
53    @property
54    def title(self):
55        return PORTLET_TITLE
56
57    def getWeblog(self):
58        portal = getToolByName(self.context, 'portal_url').getPortalObject()
59        if isinstance(self.data.blog_path, unicode):
60            path = self.data.blog_path.encode('utf-8')
61        blog = portal.restrictedTraverse(path, None)
62        return blog and IWeblog(blog) or []
63   
64    @property
65    def bloggers(self):
66        weblog = self.getWeblog()
67        return weblog.getAuthors()
68
69    @memoize
70    def getBloggerPosts(self, blogger):
71        catalog = getMultiAdapter((self.context, self.request), name=u'plone_tools').catalog()
72        pstate = getMultiAdapter((self.context, self.request), name=u'plone_portal_state')
73        portal = pstate.portal()
74        brains = catalog(path='/%s/%s' % (portal.getId(), self.data.blog_path),
75                         object_provides=interfaceToName(portal, IPossibleWeblogEntry),
76                         review_state='published',
77                         Creator=blogger,
78                        )
79        return brains
80
81    def getBloggersInfo(self ):
82
83        def bcmp(first, second):
84            if first['posts_amount'] < second['posts_amount']:
85                return -1
86            if first['posts_amount'] > second['posts_amount']:
87                return 1
88            if first['posts_amount'] == second['posts_amount']:
89                return 0
90
91        result = []
92        mtool = getToolByName(self.context, 'portal_membership')
93        for blogger in self.bloggers:
94            info = mtool.getMemberInfo(blogger.getId())
95            if info is None:
96                info = { 'fullname'    : blogger.getId(),
97                         'description' : '',
98                         'location'    : '',
99                         'language'    : '',
100                         'home_page'   : '',
101                         'username'    : blogger.getId(),
102                       }
103            if not info['fullname']:
104                info['fullname'] = blogger.getId()
105            if not info['username']:
106                info['username'] = blogger.getId()
107            info['posts_amount'] = len(self.getBloggerPosts(blogger.getId()))
108            result.append(info)
109            result.sort(bcmp)
110            result.reverse()
111        return result
112   
113    def getBloggerURL(self, blogger_id):
114        weblog = self.getWeblogContentObject()
115        return "%s/authors/%s" % (weblog.absolute_url(), blogger_id)
116   
117    def getBloggersURL(self):
118        weblog = self.getWeblogContentObject()
119        return "%s/authors" % len(weblog.absolute_url())
120
121
122class AddForm(base.AddForm):
123    form_fields = form.Fields(IBloggersPortlet)
124    label = _(u'add-portlet', default=u"Add ${portlet-name} Portlet", mapping={u'portlet-name': PORTLET_TITLE})
125    description = PORTLET_DESC
126
127    def create(self, data):
128        return Assignment(blog_path=data.get('blog_path', '/blog'))
129
130
131class EditForm(base.EditForm):
132    form_fields = form.Fields(IBloggersPortlet)
133    label = _(u'edit-portlet', default=u"Edit ${portlet-name} Portlet", mapping={u'portlet-name': PORTLET_TITLE})
134    description = PORTLET_DESC
Note: See TracBrowser for help on using the repository browser.