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)