You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/05/28 21:27:43 UTC

[09/22] git commit: [#5656] ticket:301 Summary email for bulk ticket move

[#5656] ticket:301 Summary email for bulk ticket move


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

Branch: refs/heads/cj/6218
Commit: 36234bd7ff5f1c84fd33d869a2e0f2582f0bd1b5
Parents: 75adfcc
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed May 1 10:39:23 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Fri May 24 18:35:51 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/data/mass_move_report.html        |    5 ++
 ForgeTracker/forgetracker/model/ticket.py          |    6 +-
 .../forgetracker/tests/functional/test_root.py     |   56 +++++++++++++++
 ForgeTracker/forgetracker/tracker_main.py          |   38 ++++++++++-
 4 files changed, 101 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/36234bd7/ForgeTracker/forgetracker/data/mass_move_report.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/data/mass_move_report.html b/ForgeTracker/forgetracker/data/mass_move_report.html
new file mode 100644
index 0000000..3ace7c6
--- /dev/null
+++ b/ForgeTracker/forgetracker/data/mass_move_report.html
@@ -0,0 +1,5 @@
+Tickets were moved from [{{original_tracker}}] to [{{destination_tracker}}]
+
+{% for t in tickets %}
+- [{{original_tracker}}:#{{t['original_num']}}] --> [{{destination_tracker}}:#{{t['destination_num']}}] {{t['summary']}}
+{% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/36234bd7/ForgeTracker/forgetracker/model/ticket.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index cf8249f..75c8bca 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -530,7 +530,7 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
                         o and o.username, n and n.username))
                 self.subscribe(user=n)
                 g.statsUpdater.ticketEvent("assigned", self, self.project, n)
-                if o: 
+                if o:
                     g.statsUpdater.ticketEvent("revoked", self, self.project, o)
             if old.description != self.description:
                 changes.append('Description updated:')
@@ -635,7 +635,7 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
                     attach_thumb.discussion_id = app_config.discussion_id
                 attach_thumb.app_config_id = app_config._id
 
-    def move(self, app_config):
+    def move(self, app_config, notify=True):
         '''Move ticket from current tickets app to tickets app with given app_config'''
         app = app_config.project.app_instance(app_config)
         prior_url = self.url()
@@ -724,7 +724,7 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
             message += '\n\nCan\'t be converted:\n\n'
         message += '\n'.join(messages)
         with h.push_context(ticket.project_id, app_config_id=app_config._id):
-            ticket.discussion_thread.add_post(text=message)
+            ticket.discussion_thread.add_post(text=message, notify=notify)
         return ticket
 
     def __json__(self):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/36234bd7/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 2a0e3e9..e346482 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -2296,6 +2296,62 @@ class TestBulkMove(TrackerTestController):
             assert_equal(t.discussion_thread.discussion.app_config_id, original_ac_id)
             assert t.discussion_thread.last_post is None
 
+    @td.with_tool('test2', 'Tickets', 'bugs2')
+    def test_notifications(self):
+        tickets = [
+            tm.Ticket.query.find({'summary': 'A New Hope'}).first(),
+            tm.Ticket.query.find({'summary': 'The Empire Strikes Back'}).first(),
+            tm.Ticket.query.find({'summary': 'Return Of The Jedi'}).first()]
+        p = M.Project.query.get(shortname='test2')
+        tracker = p.app_instance('bugs2')
+        first_user = M.User.by_username('test-user-0')
+        second_user = M.User.by_username('test-user-1')
+        admin = M.User.by_username('test-admin')
+        tickets[0].subscribe(user=first_user)
+        tickets[1].subscribe(user=second_user)
+        M.MonQTask.query.remove()
+        r = self.app.post('/p/test/bugs/move_tickets', {
+                    'tracker': str(tracker.config._id),
+                    '__ticket_ids': [t._id for t in tickets],
+                    '__search': '',
+                })
+        M.MonQTask.run_ready()
+        emails = M.MonQTask.query.find(dict(task_name='allura.tasks.mail_tasks.sendmail')).all()
+        assert_equal(len(emails), 3)
+        for email in emails:
+            assert_equal(email.kwargs.subject, '[test:bugs] Mass ticket moving by Test Admin')
+        first_user_email = M.MonQTask.query.find({
+            'task_name': 'allura.tasks.mail_tasks.sendmail',
+            'kwargs.destinations': str(first_user._id)
+        }).all()
+        assert_equal(len(first_user_email), 1)
+        first_user_email = first_user_email[0]
+        second_user_email = M.MonQTask.query.find({
+            'task_name': 'allura.tasks.mail_tasks.sendmail',
+            'kwargs.destinations': str(second_user._id)
+        }).all()
+        assert_equal(len(second_user_email), 1)
+        second_user_email = second_user_email[0]
+        admin_email = M.MonQTask.query.find({
+            'task_name': 'allura.tasks.mail_tasks.sendmail',
+            'kwargs.destinations': str(admin._id)
+        }).all()
+        assert_equal(len(admin_email), 1)
+        admin_email = admin_email[0]
+
+        email_header = 'Tickets were moved from [test:bugs] to [test2:bugs2]\n'
+        first_ticket_changes = 'A New Hope'
+        second_ticket_changes = 'The Empire Strikes Back'
+        third_ticket_changes = 'Return Of The Jedi'
+        assert_in(email_header, first_user_email.kwargs.text)
+        assert_in(first_ticket_changes, first_user_email.kwargs.text)
+        assert_in(email_header, second_user_email.kwargs.text)
+        assert_in(second_ticket_changes, second_user_email.kwargs.text)
+        assert_in(email_header, admin_email.kwargs.text)
+        assert_in(first_ticket_changes, admin_email.kwargs.text)
+        assert_in(second_ticket_changes, admin_email.kwargs.text)
+        assert_in(third_ticket_changes, admin_email.kwargs.text)
+
 
 def sidebar_contains(response, text):
     sidebar_menu = response.html.find('div', attrs={'id': 'sidebar'})

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/36234bd7/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index e5cf057..030d168 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -823,8 +823,44 @@ class RootController(BaseController, FeedController):
         tickets = TM.Ticket.query.find(dict(
             _id={'$in': [ObjectId(id) for id in ticket_ids]},
             app_config_id=c.app.config._id)).all()
+
+        original_tickets = {t._id: t for t in tickets}
+        filtered = filtered_by_subscription(original_tickets)
+        users = M.User.query.find({'_id': {'$in': filtered.keys()}}).all()
+        moved_tickets = {}
         for ticket in tickets:
-            ticket.move(tracker)
+            moved = ticket.move(tracker, notify=False)
+            moved_tickets[moved._id] = moved
+
+        mail = dict(
+            fromaddr = str(c.user._id),
+            reply_to = str(c.user._id),
+            subject = '[%s:%s] Mass ticket moving by %s' % (c.project.shortname,
+                                                           c.app.config.options.mount_point,
+                                                           c.user.display_name))
+        tmpl = jinja2.Environment(
+                loader=jinja2.PackageLoader('forgetracker', 'data'),
+                auto_reload=asbool(config.get('auto_reload_templates', True))
+        ).get_template('mass_move_report.html')
+        tmpl_context = {
+            'original_tracker': '%s:%s' % (c.project.shortname,
+                                           c.app.config.options.mount_point),
+            'destination_tracker': '%s:%s' % (tracker.project.shortname,
+                                              tracker.options.mount_point),
+            'tickets': [],
+        }
+        for user in users:
+            tmpl_context['tickets'] = ({
+                    'original_num': original_tickets[_id].ticket_num,
+                    'destination_num': moved_tickets[_id].ticket_num,
+                    'summary': moved_tickets[_id].summary
+                } for _id in filtered.get(user._id, []))
+            mail.update(dict(
+                message_id = h.gen_message_id(),
+                text = tmpl.render(tmpl_context),
+                destinations = [str(user._id)]))
+            mail_tasks.sendmail.post(**mail)
+
         c.app.globals.invalidate_bin_counts()
         ThreadLocalORMSession.flush_all()
         count = len(tickets)