Test coverage for vnccollab.theme.browser.util
vnccollab/ | | covered 69% (1245 of 4098 uncovered) |
theme/ | | covered 69% (1245 of 4098 uncovered) |
browser/ | | covered 74% (507 of 1985 uncovered) |
util.py | | covered 96% (5 of 130 uncovered) |
1: import simplejson
1: from Acquisition import aq_inner, aq_parent
1: from BTrees.OOBTree import OOBTree
1: from persistent.dict import PersistentDict
1: from AccessControl import getSecurityManager
1: from zope.event import notify
1: from zope.interface import alsoProvides
1: from zope.component import getMultiAdapter
1: from zope.annotation.interfaces import IAnnotations
1: from zope.viewlet.interfaces import IViewlet
1: from Products.Five.browser import BrowserView
1: from Products.CMFCore.utils import getToolByName
1: from Products.CMFPlone.utils import safe_unicode
1: from Products.Archetypes.utils import shasattr
1: from Products.Archetypes.utils import make_uuid
1: from Products.Archetypes.event import ObjectInitializedEvent
1: from Products.statusmessages.interfaces import IStatusMessage
1: from plone.app.layout.viewlets.interfaces import IPortalTop
1: from plone.app.viewletmanager.manager import BaseOrderedViewletManager
1: from vnccollab.theme import messageFactory as _
1: from vnccollab.theme.config import PORTLETS_STATES_ANNO_KEY
1: from vnccollab.theme.browser.viewlets import AddContentAreaViewlet
2: class VNCCollabUtilView(BrowserView):
1: """Utility views to call from templates"""
1: def listFolderContentTypes(self):
"""Returns list of content types used inside
current container.
"""
1: items = []
# calculate current folder's path
1: cstate = getMultiAdapter((self.context, self.request),
1: name='plone_context_state')
1: path = '/'.join(cstate.folder().getPhysicalPath())
# collect portal type list used withing current folder
1: otypes = []
1: catalog = getToolByName(self.context, 'portal_catalog')
5: for brain in catalog(path={'query': path, 'depth': 1}):
4: if brain.portal_type not in otypes:
2: otypes.append(brain.portal_type)
# prepare items list with type id and type title
1: ttool = getToolByName(self.context, 'portal_types')
3: for otype in otypes:
2: item = {'id': otype, 'title': otype}
2: if ttool is not None and shasattr(ttool, otype):
2: item['title'] = _(safe_unicode(getattr(ttool, otype).Title()))
2: items.append(item)
# finally sort items and prepend 'All' filter element
1: if len(items) > 0:
2: items.sort(lambda x,y:cmp(x['title'], y['title']))
1: items = [{'id': '', 'title': _(u'All')}] + items
1: return tuple(items)
1: def recordPortletState(self, hash, action, value):
"""Sets portlet state on site annotations"""
# check if we got anthenticated user
2: user = getSecurityManager().getUser()
2: if not user or getattr(user, 'name', '') == 'Anonymous User':
>>>>>> return _(u"No authenticated user found.")
2: annotations = IAnnotations(self.context)
2: users = annotations.get(PORTLETS_STATES_ANNO_KEY, None)
2: if users is None:
1: users = annotations[PORTLETS_STATES_ANNO_KEY] = OOBTree()
2: userid = getattr(user, '_id', user.getId())
2: portlets = users.get(userid, None)
2: if portlets is None:
1: portlets = users[userid] = PersistentDict()
2: portlet = portlets.get(hash, None)
2: if portlet is None:
1: portlet = portlets[hash] = PersistentDict()
2: portlet[action] = value
2: return 'Done.'
1: def searchContainersJSON(self, term=None, limit='20'):
"""Queries all contains in the site for a given term and returns
json list of found containers.
"""
1: limit = int(limit)
1: if not term:
>>>>>> return simplejson.dumps([])
1: context = aq_inner(self.context)
1: catalog = getToolByName(context, 'portal_catalog')
# prepare search query
6: for char in ('?', '-', '+', '*', u'\u3000'.encode('utf-8')):
5: term = term.replace(char, ' ')
1: r = " AND ".join(term.split())
1: def quote_bad_chars(s):
1: bad_chars = ["(", ")"]
3: for char in bad_chars:
2: s = s.replace(char, '"%s"' % char)
1: return s
1: r = quote_bad_chars(r) + '*'
1: data = []
1: parents = {}
1: for brain in catalog(SearchableText=r, is_folderish=True,
2: sort_on='sortable_title', sort_limit=limit)[:limit]:
1: parent = parents.get(brain.UID)
1: if not parent:
parent = parents[brain.UID] = \
1: aq_parent(aq_inner(brain.getObject()))
1: ptitle = ''
1: if parent:
1: ptitle = getattr(parent, 'Title', lambda:'')()
1: if ptitle:
1: ptitle = ' (%s)' % ptitle
1: data.append({
1: 'value': brain.UID,
1: 'label': '%s%s' % (brain.Title, ptitle),
1: 'desc': brain.Description})
1: return simplejson.dumps(data)
1: def renderAddContentAreaViewlet(self, uid):
"""Renders add content area viewlet for object with given uid"""
1: context = aq_inner(self.context)
1: catalog = getToolByName(context, 'portal_catalog')
1: brains = catalog(UID=uid)
1: if len(brains) == 0:
>>>>>> return ''
1: obj = brains[0].getObject()
1: manager = BaseOrderedViewletManager()
1: alsoProvides(manager, IPortalTop)
1: viewlet = getMultiAdapter((obj, self.request, self, manager),
1: IViewlet, name='vnccollab.theme.addcontentarea')
1: viewlet = viewlet.__of__(obj)
1: viewlet.update()
1: return viewlet.render()
1: def uploadFile(self, file):
"""Form post handler to create file.
If created successfully then redirect to it's Edit form,
otherwise to it's Add form with validation errors.
Parameter:
@file - data to upload
File title is taken from file as filename.
"""
# check it's post request
3: if self.request.method != 'POST' or not file or not file.filename:
1: raise Exception(u'Invalid request.')
2: context = aq_inner(self.context)
2: id = make_uuid('temp-id')
# make sure our id is unique
2: id = context.invokeFactory(id=id, type_name='File')
2: obj = getattr(context, id)
2: obj.update(title=file.filename, file=file)
2: obj._renameAfterCreation()
2: if obj.checkCreationFlag():
2: obj.unmarkCreationFlag()
2: obj._renameAfterCreation()
2: obj.reindexObject()
2: notify(ObjectInitializedEvent(obj))
# if file is not there then it haven't got over validation process,
# notify user about this issue
2: if not obj.get_size():
>>>>>> IStatusMessage(self.request).addStatusMessage(_(u"Attached file is "
>>>>>> "invalid, please, try to upload another one."), type="error")
# if posted by javascript then no redirect
2: if self.request.form.get('ajax_call'):
1: return '%s/edit' % obj.absolute_url()
else:
1: return self.request.response.redirect('%s/edit' %
1: obj.absolute_url())
1: def isPopupModeOn(self):
"""Returns whether popup mode is enabled"""
72: return self.request.get('popup_mode') == '1'