Commit 8e6048cd authored by Rafael Monnerat's avatar Rafael Monnerat

CMFActivity: Allow to disable/enable mail notification

parent 806cb266
......@@ -372,6 +372,9 @@ class Message(BaseMessage):
def notifyUser(self, activity_tool, retry=False):
"""Notify the user that the activity failed."""
if not activity_tool.activity_failure_mail_notification:
return
portal = activity_tool.getPortalObject()
user_email = portal.getProperty('email_to_address',
portal.getProperty('email_from_address'))
......@@ -662,6 +665,7 @@ class ActivityTool (BaseTool):
activity_creation_trace = False
activity_tracking = False
activity_timing_log = False
activity_failure_mail_notification = True
cancel_and_invoke_links_hidden = False
# Filter content (ZMI))
......@@ -781,6 +785,32 @@ class ActivityTool (BaseTool):
url += urllib.quote('Tracking log disabled')
RESPONSE.redirect(url)
security.declareProtected(Permissions.manage_properties, 'isActivityMailNotificationEnabled')
def isActivityMailNotificationEnabled(self):
return self.activity_failure_mail_notification
security.declareProtected(Permissions.manage_properties, 'manage_enableMailNotification')
def manage_enableMailNotification(self, REQUEST=None, RESPONSE=None):
"""
Enable mail notification when activity fails.
"""
self.activity_failure_mail_notification = True
if RESPONSE is not None:
url = '%s/manageActivitiesAdvanced?manage_tabs_message=' % self.absolute_url()
url += urllib.quote('Mail notification enabled')
RESPONSE.redirect(url)
security.declareProtected(Permissions.manage_properties, 'manage_disableMailNotification')
def manage_disableMailNotification(self, REQUEST=None, RESPONSE=None):
"""
Disable mail notification when activity fails.
"""
self.activity_failure_mail_notification = False
if RESPONSE is not None:
url = '%s/manageActivitiesAdvanced?manage_tabs_message=' % self.absolute_url()
url += urllib.quote('Mail notification disabled')
RESPONSE.redirect(url)
security.declareProtected(Permissions.manage_properties, 'isActivityTimingLoggingEnabled')
def isActivityTimingLoggingEnabled(self):
return self.activity_timing_log
......
......@@ -65,6 +65,28 @@
Those traces are logged and mailed when an activity fails (as part of regular activity failure mails).</p>
</td>
</tr>
<tr class="section-bar">
<td colspan="3" align="left">
<div class="form-label">
Notification options
</div>
</td>
</tr>
<tr>
<td align="left" valign="top">
Mail Notification
</td>
<td>
<dtml-if isActivityMailNotificationEnabled>
<input class="form-element" type="submit" name="manage_disableMailNotification:method" value=" Disable ">
<dtml-else>
<input class="form-element" type="submit" name="manage_enableMailNotification:method" value=" Enable ">
</dtml-if>
</td>
<td>
<p class="form-help">Notify by mail whenever an activity fails.</p>
</td>
</tr>
</table>
</form>
<table width="100%" cellspacing="0" cellpadding="2" border="0">
......
......@@ -1132,6 +1132,7 @@ class TestCMFActivity(ERP5TypeTestCase, LogInterceptor):
def failingMethod(self): raise ValueError('This method always fails')
Organisation.failingMethod = failingMethod
try:
portal_activities.activity_failure_mail_notification = True
# MESSAGE_NOT_EXECUTED
obj.activate(activity=activity).failingMethod()
self.commit()
......@@ -1154,6 +1155,41 @@ class TestCMFActivity(ERP5TypeTestCase, LogInterceptor):
self.assertEqual(countMessage(path=obj_path), 0)
self.assertFalse(message_list)
finally:
self.portal.portal_activities.activity_failure_mail_notification = True
del Organisation.failingMethod
@for_each_activity
def testTryUserNotificationDisabledOnActivityFailure(self, activity):
message_list = self.portal.MailHost._message_list
del message_list[:]
portal_activities = self.portal.portal_activities
countMessage = portal_activities.countMessage
obj = self.portal.organisation_module.newContent(portal_type='Organisation')
self.tic()
def failingMethod(self): raise ValueError('This method always fails')
Organisation.failingMethod = failingMethod
try:
portal_activities.activity_failure_mail_notification = False
# MESSAGE_NOT_EXECUTED
obj.activate(activity=activity).failingMethod()
self.commit()
self.assertFalse(message_list)
self.flushAllActivities(silent=1, loop_size=100)
# Check there is a traceback in the email notification
self.assertFalse(message_list)
portal_activities.manageClearActivities()
# MESSAGE_NOT_EXECUTABLE
obj_path = obj.getPath()
obj.activate(activity=activity).failingMethod()
self.commit()
obj.getParentValue()._delObject(obj.getId())
self.commit()
self.assertGreater(countMessage(path=obj_path), 0)
self.tic()
self.assertEqual(countMessage(path=obj_path), 0)
self.assertFalse(message_list)
finally:
portal_activities.activity_failure_mail_notification = True
del Organisation.failingMethod
def test_93_tryUserNotificationRaise(self):
......@@ -1996,6 +2032,40 @@ class TestCMFActivity(ERP5TypeTestCase, LogInterceptor):
del Organisation.failingMethod
self._ignore_log_errors()
@for_each_activity
def testNotificationFailureIsNotSavedOnEventLogWhenMailNotificationIsDisabled(self, activity):
obj = self.portal.organisation_module.newContent(portal_type='Organisation')
self.tic()
original_notifyUser = Message.notifyUser.im_func
def failSendingEmail(self, *args, **kw):
raise MailHostError('Mail is not sent')
activity_unit_test_error = Exception()
def failingMethod(self):
raise activity_unit_test_error
try:
self.portal.portal_activities.activity_failure_mail_notification = False
Message.notifyUser = failSendingEmail
Organisation.failingMethod = failingMethod
self._catch_log_errors()
obj.activate(activity=activity, priority=6).failingMethod()
self.commit()
self.flushAllActivities(silent=1, loop_size=100)
message, = self.getMessageList(activity)
self.commit()
for log_record in self.logged:
if log_record.name == 'ActivityTool' and log_record.levelname == 'WARNING':
type, value, trace = log_record.exc_info
self.commit()
self.assertIs(activity_unit_test_error, value)
self.deleteMessageList(activity, [message])
finally:
self.portal.portal_activities.activity_failure_mail_notification = True
Message.notifyUser = original_notifyUser
del Organisation.failingMethod
self._ignore_log_errors()
@for_each_activity
def testTryUserMessageContainingNoTracebackIsStillSent(self, activity):
# With Message.__call__
......@@ -2332,9 +2402,11 @@ class TestCMFActivity(ERP5TypeTestCase, LogInterceptor):
message_list = self.portal.MailHost._message_list
del message_list[:]
activity_tool = self.portal.portal_activities
kw = {}
self._catch_log_errors(subsystem='CMFActivity')
try:
activity_tool.activity_failure_mail_notification = True
for kw['activity'] in ActivityTool.activity_dict:
for kw['group_method_id'] in '', None:
obj = activity_tool.newActiveProcess()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment