You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/06/17 17:25:18 UTC

[2/2] git commit: [#6263] ticket:373 monitoring mail footer refactoring

[#6263]  ticket:373 monitoring mail footer refactoring


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/2791b9f0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/2791b9f0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/2791b9f0

Branch: refs/heads/master
Commit: 2791b9f02e7ee2e6fcf68d60f40a282beb051ca5
Parents: d871290
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Fri Jun 14 12:58:51 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Mon Jun 17 15:24:45 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/artifact.py                 |  4 +++
 Allura/allura/model/notification.py             | 33 ++++++++++++++++----
 .../templates/mail/monitor_email_footer.txt     | 25 +++++++++++++++
 Allura/allura/tests/model/test_notification.py  | 12 +++++++
 ForgeDiscussion/forgediscussion/model/forum.py  | 11 +++++++
 .../tests/functional/test_forum_admin.py        | 32 +++++++++++++++++++
 ForgeTracker/forgetracker/model/ticket.py       | 11 +++++++
 .../forgetracker/tests/functional/test_root.py  |  9 ++++++
 8 files changed, 131 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/Allura/allura/model/artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index fefd9b4..05d7c14 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -39,6 +39,7 @@ from .session import artifact_orm_session
 from .index import ArtifactReference
 from .types import ACL, ACE
 from .project import AppConfig
+from .notification import MailFooter
 
 from filesystem import File
 
@@ -405,6 +406,9 @@ class Artifact(MappedClass):
         ArtifactReference.query.remove(dict(_id=self.index_id()))
         super(Artifact, self).delete()
 
+    def get_mail_footer(self, notification, toaddr):
+        return MailFooter.standard(notification)
+
 
 class Snapshot(Artifact):
     """A snapshot of an :class:`Artifact <allura.model.artifact.Artifact>`, used in :class:`VersionedArtifact <allura.model.artifact.VersionedArtifact>`"""

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/Allura/allura/model/notification.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/notification.py b/Allura/allura/model/notification.py
index f5c9c6b..7c31a5c 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -220,11 +220,8 @@ class Notification(MappedClass):
                 **d)
         return n
 
-    def footer(self):
-        template = self.view.get_template('mail/footer.txt')
-        return template.render(dict(
-            notification=self,
-            prefix=config.get('forgemail.url', 'https://sourceforge.net')))
+    def footer(self, toaddr=''):
+        return self.ref.artifact.get_mail_footer(self, toaddr)
 
     def send_simple(self, toaddr):
         allura.tasks.mail_tasks.sendsimplemail.post(
@@ -234,7 +231,7 @@ class Notification(MappedClass):
             subject=self.subject,
             message_id=self._id,
             in_reply_to=self.in_reply_to,
-            text=(self.text or '') + self.footer())
+            text=(self.text or '') + self.footer(toaddr))
 
     def send_direct(self, user_id):
         user = User.query.get(_id=ObjectId(user_id))
@@ -579,3 +576,27 @@ class Mailbox(MappedClass):
             Notification.send_summary(
                 self.user_id, u'noreply@in.sf.net', 'Digest Email',
                 notifications)
+
+
+class MailFooter(object):
+    view = jinja2.Environment(
+        loader=jinja2.PackageLoader('allura', 'templates'),
+        auto_reload=asbool(config.get('auto_reload_templates', True)),
+    )
+
+    @classmethod
+    def _render(cls, template, **kw):
+        return cls.view.get_template(template).render(kw)
+
+    @classmethod
+    def standard(cls, notification):
+        return cls._render('mail/footer.txt',
+            notification=notification,
+            prefix=config.get('forgemail.url', 'https://sourceforge.net'))
+
+    @classmethod
+    def monitored(cls, toaddr, app_url, setting_url):
+        return cls._render('mail/monitor_email_footer.txt',
+            email=toaddr,
+            app_url=app_url,
+            setting_url=setting_url)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/Allura/allura/templates/mail/monitor_email_footer.txt
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/mail/monitor_email_footer.txt b/Allura/allura/templates/mail/monitor_email_footer.txt
new file mode 100644
index 0000000..39a9d3c
--- /dev/null
+++ b/Allura/allura/templates/mail/monitor_email_footer.txt
@@ -0,0 +1,25 @@
+{#
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+#}
+
+
+---
+
+Sent from sourceforge.net because {{email}} is subscribed to {{app_url}}
+
+To unsubscribe from further messages, a project admin can change settings at {{setting_url}}  Or if this is a mailing list, you can unsubscribe from the mailing list.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/Allura/allura/tests/model/test_notification.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_notification.py b/Allura/allura/tests/model/test_notification.py
index 6cdfbbb..469816d 100644
--- a/Allura/allura/tests/model/test_notification.py
+++ b/Allura/allura/tests/model/test_notification.py
@@ -27,6 +27,7 @@ import bson
 
 from alluratest.controller import setup_basic_test, setup_global_objects, REGISTRY
 from allura import model as M
+from allura.model.notification import MailFooter
 from allura.lib import helpers as h
 from allura.tests import decorators as td
 from forgewiki import model as WM
@@ -175,6 +176,17 @@ class TestPostNotifications(unittest.TestCase):
         finally:
             security.has_access = orig
 
+    def test_footer(self):
+        footer = MailFooter.monitored(
+                'test@mail.com',
+                'http://test1.com',
+                'http://test2.com')
+        assert 'test@mail.com is subscribed to http://test1.com' in footer
+        assert 'admin can change settings at http://test2.com' in footer
+        footer = MailFooter.standard(M.Notification())
+        assert 'Sent from sourceforge.net because you indicated interest in' in footer
+
+
     def _subscribe(self, **kw):
         self.pg.subscribe(type='direct', **kw)
         ThreadLocalORMSession.flush_all()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index e311a8b..352e620 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -24,6 +24,7 @@ from ming.utils import LazyProperty
 from ming.orm import FieldProperty, RelationProperty, ForeignIdProperty, Mapper
 
 from allura import model as M
+from allura.model.notification import MailFooter
 from allura.lib import utils
 from allura.lib import helpers as h
 
@@ -125,6 +126,16 @@ class Forum(M.Discussion):
     def icon(self):
         return ForumFile.query.get(forum_id=self._id)
 
+    def get_mail_footer(self, notification, toaddr):
+        if toaddr and toaddr == self.monitoring_email:
+            return MailFooter.monitored(
+                toaddr,
+                h.absurl(self.url()),
+                h.absurl('{0}admin/{1}/forums'.format(
+                    self.project.url(),
+                    self.app.config.options.mount_point)))
+        return super(Forum, self).get_mail_footer(notification, toaddr)
+
 class ForumFile(M.File):
     forum_id=FieldProperty(schema.ObjectId)
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py b/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
index a1bc1a2..cb85182 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
@@ -23,6 +23,7 @@ import logging
 import PIL
 from alluratest.controller import TestController
 from allura.lib import helpers as h
+from allura import model as M
 
 from forgediscussion import model as FM
 
@@ -258,3 +259,34 @@ class TestForumAdmin(TestController):
         params[f.find('input',{'style':'width: 90%'})['name']] = 'post topic'
         r = self.app.post('/discussion/save_new_topic', params=params)
         assert 'http://localhost/p/test/discussion/testforum/thread/' in r.location
+
+    def test_footer_monitoring_email(self):
+        r = self.app.get('/admin/discussion/forums')
+        r.forms[1]['add_forum.shortname'] = 'testforum'
+        r.forms[1]['add_forum.name'] = 'Test Forum'
+        r.forms[1].submit()
+        testforum = FM.Forum.query.get(shortname='testforum')
+        self.app.post('/admin/discussion/update_forums',
+                        params={'forum-0.anon_posts':'on',
+                                'forum-0.id':str(testforum._id),
+                                'forum-0.name':'Test Forum',
+                                'forum-0.shortname':'testforum',
+                                'forum-0.description':'',
+                                'forum-0.monitoring_email':'email@monitoring.com'
+                               })
+
+        r = self.app.get('/discussion/create_topic/')
+        f = r.html.find('form',{'action':'/p/test/discussion/save_new_topic'})
+        params = dict()
+        inputs = f.findAll('input')
+        for field in inputs:
+            if field.has_key('name'):
+                params[field['name']] = field.has_key('value') and field['value'] or ''
+        params[f.find('textarea')['name']] = 'post text'
+        params[f.find('select')['name']] = 'testforum'
+        params[f.find('input',{'style':'width: 90%'})['name']] = 'post topic'
+        r = self.app.post('/discussion/save_new_topic', params=params)
+        M.MonQTask.run_ready()
+        email_tasks = M.MonQTask.query.find(dict(task_name='allura.tasks.mail_tasks.sendsimplemail')).all()
+        assert 'Sent from sourceforge.net because email@monitoring.com is subscribed to http://localhost:80/p/test/discussion/testforum/' in email_tasks[0].kwargs['text'],email_tasks[0].kwargs['text']
+        assert 'a project admin can change settings at http://localhost:80/p/test/admin/discussion/forums' in email_tasks[0].kwargs['text']

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/ForgeTracker/forgetracker/model/ticket.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index 204948f..ed28a09 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -38,6 +38,7 @@ from allura.model import (Artifact, VersionedArtifact, Snapshot,
 from allura.model import User, Feed, Thread, Notification, ProjectRole
 from allura.model import ACE, ALL_PERMISSIONS, DENY_ALL
 from allura.model.timeline import ActivityObject
+from allura.model.notification import MailFooter
 
 from allura.lib import security
 from allura.lib.search import search_artifact, SearchError
@@ -926,6 +927,16 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
                     count=count, q=q, limit=limit, page=page, sort=sort,
                     solr_error=solr_error, **kw)
 
+    def get_mail_footer(self, notification, toaddr):
+        if toaddr and toaddr == self.monitoring_email:
+            return MailFooter.monitored(
+                toaddr,
+                h.absurl(self.app.url),
+                h.absurl('{0}admin/{1}/options'.format(
+                    self.project.url(),
+                    self.app.config.options.mount_point)))
+        return super(Ticket, self).get_mail_footer(notification, toaddr)
+
 class TicketAttachment(BaseAttachment):
     thumbnail_size = (100, 100)
     ArtifactType=Ticket

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2791b9f0/ForgeTracker/forgetracker/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py
index 5b038d1..af3cb28 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -2091,6 +2091,15 @@ class TestEmailMonitoring(TrackerTestController):
             self.new_ticket(summary='test')
         assert send_simple.call_count == 0, send_simple.call_count
 
+    def test_footer(self):
+        self._set_options(monitoring_type='AllTicketChanges')
+        M.MonQTask.query.remove()
+        self.new_ticket(summary='test')
+        ThreadLocalORMSession.flush_all()
+        M.MonQTask.run_ready()
+        email_tasks = M.MonQTask.query.find(dict(task_name='allura.tasks.mail_tasks.sendsimplemail')).all()
+        assert 'Sent from sourceforge.net because mailinglist@example.com is subscribed to http://localhost:80/p/test/bugs/' in email_tasks[0].kwargs['text']
+        assert 'a project admin can change settings at http://localhost:80/p/test/admin/bugs/options' in email_tasks[0].kwargs['text']
 
 class TestCustomUserField(TrackerTestController):
     def setUp(self):