Test coverage for vnccollab.theme.portlets.openerp_js
1: import re
1: import xmlrpclib
1: import traceback
1: from urlparse import urlparse, parse_qs
1: from zope.formlib import form
1: from zope.interface import implements, Interface, classProvides
1: from zope.component import getUtility
1: from zope import schema
1: from zope.annotation.interfaces import IAnnotations, IAttributeAnnotatable
1: from zope.schema.interfaces import IVocabularyFactory
1: from zope.schema.vocabulary import SimpleTerm
1: from zope.schema.vocabulary import SimpleVocabulary
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 plone.registry.interfaces import IRegistry
1: from vnccollab.theme.settings import IOpenERPSettings
1: from vnccollab.theme import messageFactory as _
2: class IOpenERPJSPortlet(IPortletDataProvider):
1: header = schema.TextLine(
1: title=_(u"Header"),
1: description=_(u"Header of the portlet."),
1: required=True,
1: default=u'OpenERP JavaScript Portlet')
1: url = schema.URI(
1: title=_(u"OpenERP URL"),
1: description=_(u"Root url to your OpenERP service."),
1: required=True,
1: default='https://erp.vnc.biz:443')
1: dbname = schema.TextLine(
1: title=_(u"Database Name"),
1: description=_(u"Name of the database of your OpenERP service."),
1: required=True,
1: default=u'db_vnc_dummy_13')
1: action_id = schema.Choice(
1: title=_(u"Widget"),
1: description=_(u"OpenERP widget to use."),
1: source = 'vnccollab.theme.openerp_js.openerp_vocabulary',
1: required=True,)
2: class Assignment(base.Assignment):
1: implements(IOpenERPJSPortlet, IAttributeAnnotatable)
1: header = u'OpenERP Customers'
1: url = u'http://demo.vnc.biz:8085'
1: dbname = u'openerp_v61_demo'
1: action_id = 22
1: @property
def title(self):
"""Return portlet header"""
>>>>>> return self.header
1: def __init__(self, header=header, url=url, dbname=dbname,
1: action_id=action_id):
>>>>>> self.header = header
>>>>>> self.url = url
>>>>>> self.dbname = dbname
>>>>>> self.action_id = action_id
2: class Renderer(base.Renderer):
1: render = ZopeTwoPageTemplateFile('templates/openerp_js.pt')
1: @property
def title(self):
"""return title of feed for portlet"""
>>>>>> return self.data.header
1: @memoize
def _getAuthCredentials(self):
"""Returns username and password for zimbra user."""
>>>>>> mtool = getToolByName(self.context, 'portal_membership')
>>>>>> member = mtool.getAuthenticatedMember()
>>>>>> username, password = member.getProperty('openerp_username', ''), \
>>>>>> member.getProperty('openerp_password', '')
# password could contain non-ascii chars, ensure it's properly encoded
>>>>>> return username, safe_unicode(password).encode('utf-8')
1: def update(self):
"""Calculates the info needed to embed an openERP widget"""
>>>>>> annotation = IAnnotations(self.data)
>>>>>> login, pwd = self._getAuthCredentials()
>>>>>> key = 'vnccollab.theme.openerp_js.embedded_url.{0}.{1}'.format(
>>>>>> self.data.action_id, login)
>>>>>> embedded_info = annotation.get(key, None)
>>>>>> if embedded_info is not None and len(embedded_info) <> 7:
>>>>>> embedded_info = (list(embedded_info[0]) + ['', '', ''])[:7]
>>>>>> if embedded_info is None:
>>>>>> embedded_info = self._embed(login, pwd)
>>>>>> error_msg = embedded_info[-1]
>>>>>> if not error_msg:
>>>>>> annotation[key] = embedded_info
self.embedded_url, self.embedded_code, self.url, \
>>>>>> self.login, self.key, _, self.error_msg = embedded_info
>>>>>> self.action_id = self.data.action_id
>>>>>> self.dbname = self.data.dbname
1: def _embed(self, login, pwd):
"""Generates the OpenERP embed widget for the give user user"""
>>>>>> url = self.data.url
>>>>>> dbname = self.data.dbname
>>>>>> model = 'share.wizard'
>>>>>> action_id = self.data.action_id
>>>>>> create_args = { 'name' : '{0}-{1}'.format(login, action_id),
>>>>>> 'action_id' : action_id,
>>>>>> 'access_mode': 'readwrite',
>>>>>> 'domain' : ['|',['state','=','draft'],['state','=','open']] }
>>>>>> embedded_url = ''
>>>>>> embedded_code = ''
>>>>>> key = ''
>>>>>> error_msg = ''
>>>>>> try:
>>>>>> server = xmlrpclib.ServerProxy(url + '/xmlrpc/common', allow_none=True)
>>>>>> uid = server.login(dbname, login, pwd)
>>>>>> server = xmlrpclib.ServerProxy(url + '/xmlrpc/object', allow_none=True)
>>>>>> id = server.execute(dbname, uid, pwd, model, 'create', create_args)
>>>>>> args = [id]
>>>>>> server.execute(dbname, uid, pwd, model, 'go_step_1', args)
>>>>>> server.execute(dbname, uid, pwd, model, 'go_step_2', args, {})
>>>>>> r = server.execute(dbname, uid, pwd, model, 'export_data', args,
>>>>>> ['embed_url', 'embed_code'])
>>>>>> embedded_url = r['datas'][0][0]
>>>>>> embedded_code = r['datas'][0][1]
>>>>>> except Exception, e:
# error_msg = str(e)
>>>>>> error_msg = traceback.format_exc()
# Parse the embed info in embedded_url and embedded_code
>>>>>> if embedded_url:
>>>>>> parsed = urlparse(embedded_url)
>>>>>> query_params = parse_qs(parsed.query)
>>>>>> url = '{0}://{1}'.format(parsed.scheme, parsed.netloc)
>>>>>> login = query_params['login'][0]
>>>>>> key = query_params['key'][0]
>>>>>> action_id = re.search('(?<=,)[0-9]+', embedded_code).group(0)
>>>>>> return (embedded_url, embedded_code, url, login, key, action_id, error_msg)
2: class AddForm(base.AddForm):
1: form_fields = form.Fields(IOpenERPJSPortlet)
1: label = _(u"Add OpenERP JavaScript Portlet")
1: description = _(u"Create an OpenERP JavaScript Portlet.")
1: def create(self, data):
>>>>>> return Assignment(**data)
2: class EditForm(base.EditForm):
1: form_fields = form.Fields(IOpenERPJSPortlet)
1: label = _(u"Edit OpenERP JavaScript Portlet")
1: description = _(u"This portlet allows managing the OpenERP JavaScript Portlet.")
'''
How to get the action_id of a widget?
Just visit http://demo.vnc.biz:8085. Go to the page you want to embed, click the green icon in the upper left side of screen, the one with "Link or Embed..." as tooltip and follow the wizard. It will generate a url with an action_id parameter.
'''
OPENERP_VOCAB = [
1: (147, _(u'Sales - Leads')),
1: (150, _(u'Sales - Opportunities')),
1: (562, _(u'Sales - Contracts')),
1: (60, _(u'Sales - Customers')),
1: (57, _(u'Sales - Contacts')),
1: (180, _(u'Sales - Products by Category')),
1: (178, _(u'Sales - Products')),
1: (158, _(u'Sales - Logged Calls')),
1: (159, _(u'Sales - Scheduled Calls')),
1: (196, _(u'Projects - Tasks')),
]
2: class OpenERPJSPortletVocabulary():
1: classProvides(IVocabularyFactory)
1: def __call__(self, context):
>>>>>> vocabularyItems = self._getVocabularyItems()
>>>>>> items = [SimpleTerm(value=value, token=value, title=title)
>>>>>> for (value, title) in vocabularyItems]
>>>>>> return SimpleVocabulary(items)
1: def _getVocabularyItems(self):
>>>>>> registry = getUtility(IRegistry)
>>>>>> settings = registry.forInterface(IOpenERPSettings)
>>>>>> openerpActions = settings.openerpActions
>>>>>> items = [(x+',???,???').split(',')[:2] for x in openerpActions]
>>>>>> return items