Test coverage for vnccollab.theme.browser.dashlet
vnccollab/ | | covered 69% (1245 of 4098 uncovered) |
theme/ | | covered 69% (1245 of 4098 uncovered) |
browser/ | | covered 74% (507 of 1985 uncovered) |
dashlet.py | | covered 72% (37 of 134 uncovered) |
1: from datetime import datetime
1: from zope.component import getUtility, getMultiAdapter, queryMultiAdapter
1: from Products.Five.browser import BrowserView
1: from Products.CMFCore.utils import getToolByName
1: from Acquisition import aq_inner
1: from plone.portlets.interfaces import IPortletManager, IPortletRenderer
1: from plone.memoize.instance import memoize
1: from vnccollab.theme.zimbrautil import IZimbraUtil
1: from vnccollab.theme.portlets import redmine_tickets
2: class Dashlet(BrowserView):
#dashlet = ViewPageTemplateFile('templates/dashlet.pt')
1: def __init__(self, context, request):
2: self.context = context
2: self.request = request
2: self.zimbra_url = request.get('zimbra_url', 'https://')
2: self.count = int(request.get('count', '5'))
2: self.type_ = request.get('type', 'all')
2: context = aq_inner(self.context)
2: portal_state = getMultiAdapter((context, self.request),
2: name=u'plone_portal_state')
2: self.portal_state = portal_state
2: self.friendlyTypes = portal_state.friendly_types()
1: def items(self):
2: type_ = self.type_
2: if type_ == 'all':
1: items = self.all_items()
1: elif type_ == 'mails':
1: items = self.all_mails()
>>>>>> elif type_ == 'news':
>>>>>> items = self.all_news()
>>>>>> elif type_ == 'recent':
>>>>>> items = self.all_recents()
>>>>>> elif type_ == 'tickets':
>>>>>> items = self.all_tickets()
else:
>>>>>> items = []
2: return items
1: def all_items(self):
"""Return the last Tickets, Mails, News and Items"""
# We'll try to get at least self.data.count elements of each type
# so when we filter by type we have enough entries to show.
1: items = self.all_news()
1: items.extend(self.all_recents())
1: items.extend(self.all_tickets())
1: items.extend(self.all_mails())
5: items.sort(lambda x, y: cmp(x.Date, y.Date), reverse=True)
1: items = self._remove_repeated(items)
1: return items[:self.count]
1: def _remove_repeated(self, items):
1: urls = []
1: uniques = []
6: for item in items:
5: url = item.getURL()
5: if url not in urls:
5: urls.append(url)
5: uniques.append(item)
1: return uniques
1: def all_news(self):
1: return self.all_by_types('News Item')
1: def all_recents(self):
1: return self.all_by_types(self.friendlyTypes)
1: def all_tickets(self):
1: renderer = self._get_redmine_ticket_portlet()
1: tickets = renderer.getTickets()
1: tickets = [FakeTicketBrain(ticket) for ticket in tickets]
1: return tickets
1: @memoize
def _get_redmine_ticket_portlet(self):
1: context = aq_inner(self.context)
1: portal = getToolByName(context, 'portal_url').getPortalObject()
1: manager = getUtility(IPortletManager, name='plone.rightcolumn',
1: context=portal)
1: assignment = redmine_tickets.Assignment(count=self.count)
1: renderer = queryMultiAdapter((context, self.request, self,
1: manager, assignment), IPortletRenderer)
1: renderer.update()
1: return renderer
1: @memoize
def all_mails(self):
2: mtool = getToolByName(self.context, 'portal_membership')
2: member = mtool.getAuthenticatedMember()
2: username = member.getProperty('zimbra_username', '')
2: password = member.getProperty('zimbra_password', '')
2: zimbraUtil = getUtility(IZimbraUtil)
2: try:
2: client = zimbraUtil.get_client(url=self.zimbra_url,
2: username=username, password=password)
2: mails = client.get_emails(limit=self.count)
2: except:
2: mails = []
2: return [FakeMailBrain(mail) for mail in mails][:self.count]
1: def all_by_types(self, portal_types):
2: context = aq_inner(self.context)
2: catalog = getToolByName(context, 'portal_catalog')
2: path = self.portal_state.navigation_root_path()
2: limit = self.count
2: return catalog(portal_type=portal_types,
2: path=path,
2: sort_on='Date',
2: sort_order='reverse',
2: sort_limit=limit)[:limit]
2: class FakeTicketBrain:
'''Wrapper for redmine ticket implementing the minimum attributes
1: of brains.'''
1: def __init__(self, dct):
>>>>>> self.id = dct.get('id', '')
>>>>>> self.url = dct.get('url', '')
>>>>>> self.Title = dct.get('title', '')
>>>>>> try:
>>>>>> date = datetime.strptime(dct['date'],
>>>>>> '%b %d, %Y %I:%M %p').isoformat()
>>>>>> except Exception:
>>>>>> date = dct['date']
>>>>>> self.Date = date
>>>>>> self.portal_type = 'Redmine Ticket'
# html -> plain text
>>>>>> portal_transforms = getToolByName(self, 'portal_transforms')
>>>>>> html_body = (dct.get('body', u'') or u'').encode('utf-8')
>>>>>> txt_body = portal_transforms.convert('html_to_text',
>>>>>> html_body).getData()
>>>>>> self.Description = txt_body.decode('utf-8')
1: @property
def pretty_title_or_id(self):
>>>>>> if self.Title:
>>>>>> return self.Title
else:
>>>>>> return self.id
1: def getURL(self):
>>>>>> return self.url
2: class FakeMailBrain:
'''Wrapper for zimbra mail implementing the minimum attributes
1: of brains.'''
1: def __init__(self, dct):
>>>>>> self.id = dct.get('id', '')
>>>>>> self.url = dct.get('url', '')
>>>>>> self.Title = dct.get('subject', '')
# TODO: html -> plain text
>>>>>> self.Description = dct.get('body', '')
>>>>>> date = datetime.fromtimestamp(int(dct['date']) / 1000)
>>>>>> self.Date = date.isoformat()
>>>>>> self.portal_type = 'Mail'
1: @property
def pretty_title_or_id(self):
>>>>>> if self.Title:
>>>>>> return self.Title
else:
>>>>>> return self.id
1: def getURL(self):
>>>>>> return self.url