Test coverage for vnccollab.theme.browser.zimbratask

vnccollab/      covered 69% (1245 of 4098 uncovered)
    theme/      covered 69% (1245 of 4098 uncovered)
        browser/      covered 74% (507 of 1985 uncovered)
            zimbratask.py      covered 52% (58 of 122 uncovered)

    1: from zope import schema
    1: from zope.interface import implements, Interface, Invalid, invariant
    1: from zope.component import getMultiAdapter, getUtility
       
    1: from z3c.form import form, field, button
    1: from z3c.form.interfaces import IErrorViewSnippet
    1: from Products.CMFCore.utils import getToolByName
    1: from Products.statusmessages.interfaces import IStatusMessage
       
    1: from collective.z3cform.datepicker.widget import DatePickerFieldWidget
       
    1: from vnccollab.theme import messageFactory as _
    1: from vnccollab.theme.zimbrautil import IZimbraUtil
    1: import vnccollab.theme.util as util
       
       
    2: class BothDatesError(Invalid):
    1:     __doc__ == _(u'''Either both or none dates must be provided''')
       
       
    2: class IZimbraTaskForm(Interface):
           # TODO: List Id
       
           # we end it with _ to avoid conflicts in newtask.py
    1:     subject_ = schema.TextLine(
    1:         title=_(u'Subject'),
    1:         description=u'',
    1:         required=True)
       
    1:     location = schema.TextLine(
    1:         title=_(u'Location'),
    1:         description=_('Task Location'),
    1:         required=False)
       
    1:     status = schema.Choice(
    1:         title=_(u"Status"),
    1:         description=u'',
    1:         vocabulary='vnccollab.theme.vocabularies.StatusZimbraTaskVocabulary',
    1:         required=True)
       
           # we end it with _ to avoid conflicts in newtask.py
    1:     priority_ = schema.Choice(
    1:         title=_(u"Priority"),
    1:         description=u'',
    1:         vocabulary='vnccollab.theme.vocabularies.PrioritiesZimbraTaskVocabulary',
    1:         default='5',
    1:         required=True)
       
    1:     percentComplete = schema.Choice(
    1:         title=_(u"Percentage of Completion"),
    1:         description=u'',
    1:         vocabulary='vnccollab.theme.vocabularies.PercentageZimbraTaskVocabulary',
    1:         required=True)
       
    1:     startDate = schema.Date(
    1:         title=_(u"Start date"),
    1:         description=u'',
    1:         required=False)
       
    1:     endDate = schema.Date(
    1:         title=_(u"Due date"),
    1:         description=u'',
    1:         required=False)
       
    1:     content = schema.Text(
    1:         title=_(u"Description"),
    1:         description=u'',
    1:         required=False,
    1:         default=u'')
       
    1:     @invariant
           def validateBothDates(data):
>>>>>> if not data.startDate and not data.endDate:
>>>>>> return
>>>>>> if not data.startDate or not data.endDate:
>>>>>> raise BothDatesError(_("You must set both start and end date or none."))
2: class ZimbraTaskForm(form.Form): 1: implements(IZimbraTaskForm) 1: fields = field.Fields(IZimbraTaskForm) 1: fields['startDate'].widgetFactory = DatePickerFieldWidget 1: fields['endDate'].widgetFactory = DatePickerFieldWidget 1: label = _("New Zimbra Task") 1: prefix = 'zimbra_task_form' 1: formErrorsMessage = _(u"There were some errors.") 1: successMessage = _(u"Task was created successfully.") 1: ignoreContext = True 1: @property def action(self): """See interfaces.IInputForm"""
>>>>>> return self.context.absolute_url() + '/@@' + self.__name__
1: @button.buttonAndHandler(_(u"Create"), name='create') def handleCreate(self, action): """Create zimbra task using SOAP API."""
>>>>>> data, errors = self.extractData()
>>>>>> if errors:
>>>>>> self.status = self.formErrorsMessage
>>>>>> return
>>>>>> url = util.getZimbraUrl(self.context)
>>>>>> username, password = util.getZimbraCredentials(self.context)
>>>>>> if not username or not password or not url:
>>>>>> if not username or not password:
>>>>>> msg = _(u"Please, set correct zimbra username and password in "
"your profile form in order to create a zimbra task.") else:
>>>>>> msg = _(u"Please, set Zimbra URL in Control "
" Panel (Configuration Registry).") # issue form level error
>>>>>> self.status = msg
>>>>>> error = getMultiAdapter((Invalid(u''), self.request, None,
>>>>>> None, self, self.context), IErrorViewSnippet)
>>>>>> error.update()
>>>>>> self.widgets.errors += (error,)
>>>>>> return
>>>>>> created = False
>>>>>> try:
>>>>>> zimbraUtil = getUtility(IZimbraUtil)
>>>>>> client = zimbraUtil.get_client(url, username, password)
>>>>>> email = util.getZimbraEmail(self.context)
>>>>>> url = self.context.absolute_url()
>>>>>> description = self.context.Description()
>>>>>> content = u'%s\n\n%s' % (url, description)
>>>>>> data['author'] = email
>>>>>> data['subject'] = data['subject_']
>>>>>> data['priority'] = data['priority_']
>>>>>> data['content'] = content
>>>>>> task = client.create_task(data)
>>>>>> util.addZimbraAnnotatedTasks(self.context, task)
>>>>>> created = True
>>>>>> except Exception:
>>>>>> plone_utils = getToolByName(self.context, 'plone_utils')
>>>>>> exception = plone_utils.exceptionString()
>>>>>> self.status = _(u"Unable create issue: ${exception}",
>>>>>> mapping={u'exception': exception})
>>>>>> error = getMultiAdapter((Invalid(u''), self.request, None,
>>>>>> None, self, self.context), IErrorViewSnippet)
>>>>>> error.update()
>>>>>> self.widgets.errors += (error,)
>>>>>> return
else:
>>>>>> if not created:
>>>>>> self.status = _(u"Task wasn't created, please, check your "
"settings or contact site administrator if you are sure " "your settings are set properly.")
>>>>>> error = getMultiAdapter((Invalid(u''), self.request, None,
>>>>>> None, self, self.context), IErrorViewSnippet)
>>>>>> error.update()
>>>>>> self.widgets.errors += (error,)
>>>>>> return
>>>>>> self.status = self.successMessage
>>>>>> IStatusMessage(self.request).addStatusMessage(self.successMessage,
>>>>>> type='info')
>>>>>> came_from = self.request.get('HTTP_REFERER') or self.context.absolute_url()
>>>>>> return self.request.response.redirect(came_from)