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/04/22 21:41:17 UTC

[01/12] git commit: [#2502] ticket:300 Group changes by user, based on his subscriptions

Updated Branches:
  refs/heads/master 4ac36f9fb -> 25d074616


[#2502] ticket:300 Group changes by user, based on his subscriptions


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

Branch: refs/heads/master
Commit: e802ccea1822cf597de8dfa487f7e7e29b53ff7a
Parents: bc4fc9f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 12 10:57:29 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:26 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |   40 +++++++++++++++
 ForgeTracker/forgetracker/tracker_main.py          |   24 +++++++++
 2 files changed, 64 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e802ccea/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 b5d87a0..9ccc963 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -33,6 +33,7 @@ from alluratest.controller import TestController
 from allura import model as M
 from forgewiki import model as wm
 from forgetracker import model as tm
+from forgetracker.tracker_main import filtered_by_subscription
 
 from allura.lib.security import has_access
 from allura.lib import helpers as h
@@ -1165,6 +1166,45 @@ class TestFunctionalController(TrackerTestController):
                            third_ticket_changes])
         assert_equal(email, admin_email.kwargs.text)
 
+    def test_filtered_by_subscription(self):
+        self.new_ticket(summary='test first ticket', status='open')
+        self.new_ticket(summary='test second ticket', status='open')
+        self.new_ticket(summary='test third ticket', status='open')
+        tickets = []
+        users = []
+        tickets.append(tm.Ticket.query.get(summary='test first ticket'))
+        tickets.append(tm.Ticket.query.get(summary='test second ticket'))
+        tickets.append(tm.Ticket.query.get(summary='test third ticket'))
+        users.append(M.User.by_username('test-user-0'))
+        users.append(M.User.by_username('test-user-1'))
+        users.append(M.User.by_username('test-user-2'))
+        admin = M.User.by_username('test-admin')
+        tickets[0].subscribe(user=users[0])
+        tickets[1].subscribe(user=users[1])
+        tickets[2].subscribe(user=users[2])
+        ThreadLocalORMSession.flush_all()
+        M.MonQTask.run_ready()
+        ThreadLocalORMSession.flush_all()
+
+        # Pretend we're changing first and second ticket.
+        # Then we should notify test-user-0, test-user-1 and admin.
+        # test-user-2 shoudn't be notified
+        # (he has subscription to third ticket, but it didn't change).
+        # test-user-0 should see changes only for first ticket.
+        # test-user-1 - only for second.
+        # admin - for both (since he has tool subscription).
+        changes = {
+            tickets[0]._id: {'ticket': tickets[0], 'changes': 'Ticket 1 changes'},
+            tickets[1]._id: {'ticket': tickets[1], 'changes': 'Ticket 2 changes'},
+        }
+        filtered_changes = filtered_by_subscription(changes)
+        filtered_users = [uid for uid, data in filtered_changes.iteritems()]
+        assert_equal(sorted(filtered_users), sorted([u._id for u in users[:-1] + [admin]]))
+        ticket_ids = [t._id for t in tickets]
+        assert_equal(filtered_changes[users[0]._id], ticket_ids[0:1])
+        assert_equal(filtered_changes[users[1]._id], ticket_ids[1:2])
+        assert_equal(sorted(filtered_changes[admin._id]), sorted(ticket_ids[:-1]))
+
     def test_vote(self):
         r = self.new_ticket(summary='test vote').follow()
         assert_false(r.html.find('div', {'id': 'vote'}))

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e802ccea/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 102a544..bb0fe7b 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -1150,6 +1150,30 @@ class changelog(object):
         return t
 
 
+def filtered_by_subscription(tickets, project_id=None, app_config_id=None):
+    p_id = project_id if project_id else c.project._id
+    ac_id = app_config_id if app_config_id else c.app.config._id
+    ticket_ids = tickets.keys()
+    users = M.Mailbox.query.find(dict(project_id=p_id, app_config_id=ac_id))
+    users = [u.user_id for u in users]
+    filtered = {}
+    for uid in users:
+        params = dict(
+            user_id=uid,
+            project_id=p_id,
+            app_config_id=ac_id)
+        if M.Mailbox.subscribed(**params):
+            filtered[uid] = ticket_ids  # subscribed to entire tool, will see all changes
+            continue
+        for t_id, data in tickets.iteritems():
+            params.update({'artifact': data['ticket']})
+            if M.Mailbox.subscribed(**params):
+                if filtered.get('uid') is None:
+                    filtered[uid] = []
+                filtered[uid].append(t_id)
+    return filtered
+
+
 class TicketController(BaseController):
 
     def __init__(self, ticket_num=None):


[09/12] git commit: [#2502] ticket:300 Simplify filtered_by_subscription()

Posted by jo...@apache.org.
[#2502] ticket:300 Simplify filtered_by_subscription()


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

Branch: refs/heads/master
Commit: e843f9fbc1c98e2a88191d974cc872d32be29691
Parents: 201cc53
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 12 11:43:50 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |    4 ++--
 ForgeTracker/forgetracker/tracker_main.py          |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e843f9fb/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 9ccc963..566f534 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1194,8 +1194,8 @@ class TestFunctionalController(TrackerTestController):
         # test-user-1 - only for second.
         # admin - for both (since he has tool subscription).
         changes = {
-            tickets[0]._id: {'ticket': tickets[0], 'changes': 'Ticket 1 changes'},
-            tickets[1]._id: {'ticket': tickets[1], 'changes': 'Ticket 2 changes'},
+            tickets[0]._id: tickets[0],
+            tickets[1]._id: tickets[1],
         }
         filtered_changes = filtered_by_subscription(changes)
         filtered_users = [uid for uid, data in filtered_changes.iteritems()]

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e843f9fb/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 28c73ac..7ea8693 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -1165,8 +1165,8 @@ def filtered_by_subscription(tickets, project_id=None, app_config_id=None):
         if M.Mailbox.subscribed(**params):
             filtered[uid] = ticket_ids  # subscribed to entire tool, will see all changes
             continue
-        for t_id, data in tickets.iteritems():
-            params.update({'artifact': data['ticket']})
+        for t_id, ticket in tickets.iteritems():
+            params.update({'artifact': ticket})
             if M.Mailbox.subscribed(**params):
                 if filtered.get('uid') is None:
                     filtered[uid] = []


[12/12] git commit: [#2502] ticket:300 Add userfield to test

Posted by jo...@apache.org.
[#2502] ticket:300 Add userfield to test


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

Branch: refs/heads/master
Commit: ff0d78a81770e9f7d6db51e3a4dee8798c37e110
Parents: 1f298f1
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Apr 16 13:28:23 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |    7 ++++-
 ForgeTracker/forgetracker/tracker_main.py          |   23 +++++++++++----
 2 files changed, 23 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ff0d78a8/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 1321e6f..ca51a10 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1113,7 +1113,8 @@ class TestFunctionalController(TrackerTestController):
                           second_ticket._id,
                           third_ticket._id),
                       'status': 'accepted',
-                      '_milestone': '2.0'})
+                      '_milestone': '2.0',
+                      'assigned_to': 'test-admin'})
         M.MonQTask.run_ready()
 
         emails = M.MonQTask.query.find(dict(task_name='allura.tasks.mail_tasks.sendmail')).all()
@@ -1142,20 +1143,24 @@ class TestFunctionalController(TrackerTestController):
         # Expected data
         email_header = '''Mass edit changing:
 
+- **Owner**: Test Admin
 - **Status**: accepted
 - **Milestone**: 2.0
 
 '''
         first_ticket_changes = '''ticket: [bugs:#1]
 
+- **Owner**: Anonymous --> Test Admin
 - **Status**: open --> accepted
 '''
         second_ticket_changes = '''ticket: [bugs:#2]
 
+- **Owner**: Anonymous --> Test Admin
 - **Milestone**: 1.0 --> 2.0
 '''
         third_ticket_changes = '''ticket: [bugs:#3]
 
+- **Owner**: Anonymous --> Test Admin
 - **Status**: unread --> accepted
 - **Milestone**: 1.0 --> 2.0
 '''

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ff0d78a8/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 01b9f45..6a5a1f3 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -814,22 +814,22 @@ class RootController(BaseController):
         changed_tickets = {}
         for ticket in tickets:
             message = ''
-            for k, v in values.iteritems():
+            for k, v in sorted(values.iteritems()):
                 if k == 'assigned_to_id':
                     new_user = M.User.query.get(_id=v)
                     old_user = M.User.query.get(_id=getattr(ticket, k))
                     if new_user:
                         message += get_change_text(
                             get_label(k),
-                            new_user.username,
-                            old_user.username)
+                            new_user.display_name,
+                            old_user.display_name)
                 else:
                     message += get_change_text(
                         get_label(k),
                         v,
                         getattr(ticket, k))
                 setattr(ticket, k, v)
-            for k, v in custom_values.iteritems():
+            for k, v in sorted(custom_values.iteritems()):
                 def cf_val(cf):
                     return ticket.get_custom_user(cf.name) \
                            if cf.type == 'user' \
@@ -847,6 +847,7 @@ class RootController(BaseController):
                 changed_tickets[ticket._id] = ticket
                 ticket.discussion_thread.post(message, notify=False)
                 ticket.commit()
+
         filtered_changes = filtered_by_subscription(changed_tickets)
         users = M.User.query.find({'_id': {'$in': filtered_changes.keys()}}).all()
         def changes_iter(user):
@@ -863,8 +864,18 @@ class RootController(BaseController):
                 loader=jinja2.PackageLoader('forgetracker', 'data'),
                 auto_reload=asbool(config.get('auto_reload_templates', True)),
         ).get_template('mass_report')
-        head = ['- **%s**: %s' % (get_label(f), v) for f, v in values.iteritems()]
-        head += ['- **%s**: %s' % (get_label(f), v) for f, v in custom_values.iteritems()]
+        head = []
+        for f, v in sorted(values.iteritems()):
+            if f == 'assigned_to_id':
+                user = M.User.query.get(_id=v)
+                v = user.display_name if user else v
+            head.append('- **%s**: %s' % (get_label(f), v))
+        for f, v in sorted(custom_values.iteritems()):
+            cf = custom_fields[k]
+            if cf.type == 'user':
+                user = M.User.by_username(v)
+                v = user.display_name if user else v
+            head.append('- **%s**: %s' % (cf.label, v))
         tmpl_context = {'context': c, 'data': {'header': '\n'.join(['Mass edit changing:', ''] + head)}}
         for user in users:
             tmpl_context['data'].update({'changes': changes_iter(user)})


[06/12] git commit: [#2502] ticket:300 Fixed bug in filtered_by_subscription

Posted by jo...@apache.org.
[#2502] ticket:300 Fixed bug in filtered_by_subscription


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

Branch: refs/heads/master
Commit: b01ecfb6a6a482e3337c6d6a17d2041bbb781f89
Parents: 24e8e46
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Apr 17 09:52:57 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |   11 ++++++-----
 ForgeTracker/forgetracker/tracker_main.py          |    8 ++++----
 2 files changed, 10 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b01ecfb6/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 91b718c..c21744c 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1222,6 +1222,7 @@ class TestFunctionalController(TrackerTestController):
         users.append(M.User.by_username('test-user-2'))
         admin = M.User.by_username('test-admin')
         tickets[0].subscribe(user=users[0])
+        tickets[0].subscribe(user=users[1])
         tickets[1].subscribe(user=users[1])
         tickets[2].subscribe(user=users[2])
         ThreadLocalORMSession.flush_all()
@@ -1233,8 +1234,8 @@ class TestFunctionalController(TrackerTestController):
         # test-user-2 shoudn't be notified
         # (he has subscription to third ticket, but it didn't change).
         # test-user-0 should see changes only for first ticket.
-        # test-user-1 - only for second.
-        # admin - for both (since he has tool subscription).
+        # test-user-1 - for both (separate subscription for both tickets).
+        # admin - for both (tool subscription).
         changes = {
             tickets[0]._id: tickets[0],
             tickets[1]._id: tickets[1],
@@ -1243,9 +1244,9 @@ class TestFunctionalController(TrackerTestController):
         filtered_users = [uid for uid, data in filtered_changes.iteritems()]
         assert_equal(sorted(filtered_users), sorted([u._id for u in users[:-1] + [admin]]))
         ticket_ids = [t._id for t in tickets]
-        assert_equal(filtered_changes[users[0]._id], ticket_ids[0:1])
-        assert_equal(filtered_changes[users[1]._id], ticket_ids[1:2])
-        assert_equal(sorted(filtered_changes[admin._id]), sorted(ticket_ids[:-1]))
+        assert_equal(filtered_changes[users[0]._id], set(ticket_ids[0:1]))
+        assert_equal(filtered_changes[users[1]._id], set(ticket_ids[:-1]))
+        assert_equal(filtered_changes[admin._id], set(ticket_ids[:-1]))
 
     def test_vote(self):
         r = self.new_ticket(summary='test vote').follow()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b01ecfb6/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 34ee011..396d300 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -1220,14 +1220,14 @@ def filtered_by_subscription(tickets, project_id=None, app_config_id=None):
             project_id=p_id,
             app_config_id=ac_id)
         if M.Mailbox.subscribed(**params):
-            filtered[uid] = ticket_ids  # subscribed to entire tool, will see all changes
+            filtered[uid] = set(ticket_ids)  # subscribed to entire tool, will see all changes
             continue
         for t_id, ticket in tickets.iteritems():
             params.update({'artifact': ticket})
             if M.Mailbox.subscribed(**params):
-                if filtered.get('uid') is None:
-                    filtered[uid] = []
-                filtered[uid].append(t_id)
+                if filtered.get(uid) is None:
+                    filtered[uid] = set()
+                filtered[uid].add(t_id)
     return filtered
 
 


[03/12] git commit: [#2502] ticket:300 Expand test with checks for email content

Posted by jo...@apache.org.
[#2502] ticket:300 Expand test with checks for email content


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

Branch: refs/heads/master
Commit: bc4fc9f3aa861d34ed607907175da007a88cb386
Parents: 02b97b5
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 12 09:24:43 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:26 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |   40 ++++++++++++---
 1 files changed, 32 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/bc4fc9f3/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 3d1f14c..b5d87a0 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1090,9 +1090,9 @@ class TestFunctionalController(TrackerTestController):
         assert_false('test third ticket' in str(ticket_rows))
 
     def test_bulk_edit_notifications(self):
-        self.new_ticket(summary='test first ticket', status='open')
-        self.new_ticket(summary='test second ticket', status='open')
-        self.new_ticket(summary='test third ticket', status='open')
+        self.new_ticket(summary='test first ticket', status='open', _milestone='2.0')
+        self.new_ticket(summary='test second ticket', status='accepted', _milestone='1.0')
+        self.new_ticket(summary='test third ticket', status='unread')
         ThreadLocalORMSession.flush_all()
         M.MonQTask.run_ready()
         ThreadLocalORMSession.flush_all()
@@ -1111,14 +1111,14 @@ class TestFunctionalController(TrackerTestController):
                           first_ticket._id,
                           second_ticket._id,
                           third_ticket._id),
-                      'status': 'accepted'})
+                      'status': 'accepted',
+                      '_milestone': '2.0'})
         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] Bulk edit report')
-            assert_in('- **Status**: open --> accepted\n', email.kwargs.text)
+            assert_equal(email.kwargs.subject, '[test:bugs] Mass edit changes')
         first_user_email = M.MonQTask.query.find({
             'task_name': 'allura.tasks.mail_tasks.sendmail',
             'kwargs.destinations': first_user._id
@@ -1138,8 +1138,32 @@ class TestFunctionalController(TrackerTestController):
         assert_equal(len(admin_email), 1)
         admin_email = admin_email[0]
 
-        # TODO: check email text for first, second and admin users
-        #assert_in('### Affected tickets\n\n- [bugs:#1] test first ticket', first_user_email.kwargs.text)
+        # Expected data
+        email_header = '''Mass edit changing:
+- **status**: accepted
+- **Milestone: 2.0
+'''
+        first_ticket_changes = '''ticket: [bugs:#1]
+- **status**: open --> accepted
+- **Milestone: 2.0 --> 2.0
+'''
+        second_ticket_changes = '''ticket: [bugs:#2]
+- **status**: accepted --> accepted
+- **Milestone: 1.0 --> 2.0
+'''
+        third_ticket_changes = '''ticket: [bugs:#3]
+- **status**: unread --> accepted
+- **Milestone: --> 2.0
+'''
+        email = '\n'.join([email_header, first_ticket_changes])
+        assert_equal(email, first_user_email.kwargs.text)
+        email = '\n'.join([email_header, second_ticket_changes])
+        assert_equal(email, second_user_email.kwargs.text)
+        email = '\n'.join([email_header,
+                           first_ticket_changes,
+                           second_ticket_changes,
+                           third_ticket_changes])
+        assert_equal(email, admin_email.kwargs.text)
 
     def test_vote(self):
         r = self.new_ticket(summary='test vote').follow()


[08/12] git commit: [#2502] ticket:300 Send report to monitoring email, if set

Posted by jo...@apache.org.
[#2502] ticket:300 Send report to monitoring email, if set


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

Branch: refs/heads/master
Commit: 24e8e46aaf860e1650afe00ff2e2ee373befc4e7
Parents: ff0d78a
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Apr 16 13:52:05 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |   35 +++++++++++++++
 ForgeTracker/forgetracker/tracker_main.py          |   16 ++++++-
 2 files changed, 49 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/24e8e46a/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 ca51a10..91b718c 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1173,6 +1173,41 @@ class TestFunctionalController(TrackerTestController):
         assert_in(second_ticket_changes, admin_email.kwargs.text)
         assert_in(third_ticket_changes, admin_email.kwargs.text)
 
+    def test_bulk_edit_notifications_monitoring_email(self):
+        self.app.post('/admin/bugs/set_options', params={
+            'TicketMonitoringEmail': 'monitoring@email.com',
+            'TicketMonitoringType': 'AllTicketChanges',
+        })
+        self.new_ticket(summary='test first ticket', status='open', _milestone='2.0')
+        ThreadLocalORMSession.flush_all()
+        M.MonQTask.run_ready()
+        ThreadLocalORMSession.flush_all()
+        ticket = tm.Ticket.query.get(summary='test first ticket')
+        M.MonQTask.query.remove()
+        self.app.post('/p/test/bugs/update_tickets', {
+                      '__search': '',
+                      '__ticket_ids': [ticket._id],
+                      'status': 'accepted'})
+        M.MonQTask.run_ready()
+        emails = M.MonQTask.query.find(dict(task_name='allura.tasks.mail_tasks.sendmail')).all()
+        assert_equal(len(emails), 2)  # one for admin and one for monitoring email
+        for email in emails:
+            assert_equal(email.kwargs.subject, '[test:bugs] Mass edit changes by Test Admin')
+        admin = M.User.by_username('test-admin')
+        admin_email = M.MonQTask.query.find({
+            'task_name': 'allura.tasks.mail_tasks.sendmail',
+            'kwargs.destinations': str(admin._id)
+        }).all()
+        monitoring_email = M.MonQTask.query.find({
+            'task_name': 'allura.tasks.mail_tasks.sendmail',
+            'kwargs.destinations': 'monitoring@email.com'
+        }).all()
+        assert_equal(len(admin_email), 1)
+        assert_equal(len(monitoring_email), 1)
+        admin_email_text = admin_email[0].kwargs.text
+        monitoring_email_text = monitoring_email[0].kwargs.text
+        assert_equal(admin_email_text, monitoring_email_text)
+
     def test_filtered_by_subscription(self):
         self.new_ticket(summary='test first ticket', status='open')
         self.new_ticket(summary='test second ticket', status='open')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/24e8e46a/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 6a5a1f3..34ee011 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -871,7 +871,7 @@ class RootController(BaseController):
                 v = user.display_name if user else v
             head.append('- **%s**: %s' % (get_label(f), v))
         for f, v in sorted(custom_values.iteritems()):
-            cf = custom_fields[k]
+            cf = custom_fields[f]
             if cf.type == 'user':
                 user = M.User.by_username(v)
                 v = user.display_name if user else v
@@ -884,7 +884,19 @@ class RootController(BaseController):
                 text = tmpl.render(tmpl_context),
                 destinations = [str(user._id)]))
             mail_tasks.sendmail.post(**mail)
-            # TODO: send summary on ticket's monitoring email
+
+        if c.app.config.options.get('TicketMonitoringType') == 'AllTicketChanges':
+            monitoring_email = c.app.config.options.get('TicketMonitoringEmail')
+            def all_changes():
+                for t_id in changed_tickets.keys():
+                    yield (changed_tickets[t_id].ticket_num, changes[t_id])
+            tmpl_context['data'].update({'changes': all_changes()})
+            mail.update(dict(
+                message_id = h.gen_message_id(),
+                text = tmpl.render(tmpl_context),
+                destinations = [monitoring_email]))
+            mail_tasks.sendmail.post(**mail)
+
         c.app.globals.invalidate_bin_counts()
         ThreadLocalORMSession.flush_all()
         count = len(tickets)


[10/12] git commit: [#2502] ticket:300 Add \n before lists, thus markdown will render them properly

Posted by jo...@apache.org.
[#2502] ticket:300 Add \n before lists, thus markdown will render them properly


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

Branch: refs/heads/master
Commit: 1f298f19d78a08706136747b6ccff8d1e3e0691e
Parents: 92f0595
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Apr 16 12:38:47 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/data/mass_report         |    1 +
 .../forgetracker/tests/functional/test_root.py     |    4 ++++
 ForgeTracker/forgetracker/tracker_main.py          |    2 +-
 3 files changed, 6 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1f298f19/ForgeTracker/forgetracker/data/mass_report
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/data/mass_report b/ForgeTracker/forgetracker/data/mass_report
index 629a1e2..72ae642 100644
--- a/ForgeTracker/forgetracker/data/mass_report
+++ b/ForgeTracker/forgetracker/data/mass_report
@@ -2,5 +2,6 @@
 
 {% for t_num, change_text in data.changes %}
 ticket: [{{ context.app.config.options.mount_point }}:#{{ t_num }}]
+
 {{ change_text }}
 {% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1f298f19/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 760f740..1321e6f 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1141,17 +1141,21 @@ class TestFunctionalController(TrackerTestController):
 
         # Expected data
         email_header = '''Mass edit changing:
+
 - **Status**: accepted
 - **Milestone**: 2.0
 
 '''
         first_ticket_changes = '''ticket: [bugs:#1]
+
 - **Status**: open --> accepted
 '''
         second_ticket_changes = '''ticket: [bugs:#2]
+
 - **Milestone**: 1.0 --> 2.0
 '''
         third_ticket_changes = '''ticket: [bugs:#3]
+
 - **Status**: unread --> accepted
 - **Milestone**: 1.0 --> 2.0
 '''

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1f298f19/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 132f9ec..01b9f45 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -865,7 +865,7 @@ class RootController(BaseController):
         ).get_template('mass_report')
         head = ['- **%s**: %s' % (get_label(f), v) for f, v in values.iteritems()]
         head += ['- **%s**: %s' % (get_label(f), v) for f, v in custom_values.iteritems()]
-        tmpl_context = {'context': c, 'data': {'header': '\n'.join(['Mass edit changing:'] + head)}}
+        tmpl_context = {'context': c, 'data': {'header': '\n'.join(['Mass edit changing:', ''] + head)}}
         for user in users:
             tmpl_context['data'].update({'changes': changes_iter(user)})
             mail.update(dict(


[11/12] git commit: [#2502] ticket:300 Add ticket's summary for each ticket in the email

Posted by jo...@apache.org.
[#2502] ticket:300 Add ticket's summary for each ticket in the email


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

Branch: refs/heads/master
Commit: 25d074616b8b93fe5907835f730bc8dd68c149fa
Parents: b01ecfb
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Apr 17 10:00:14 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/data/mass_report         |    4 ++--
 .../forgetracker/tests/functional/test_root.py     |    6 +++---
 ForgeTracker/forgetracker/tracker_main.py          |    4 ++--
 3 files changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/25d07461/ForgeTracker/forgetracker/data/mass_report
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/data/mass_report b/ForgeTracker/forgetracker/data/mass_report
index 72ae642..faddde2 100644
--- a/ForgeTracker/forgetracker/data/mass_report
+++ b/ForgeTracker/forgetracker/data/mass_report
@@ -1,7 +1,7 @@
 {{ data.header }}
 
-{% for t_num, change_text in data.changes %}
-ticket: [{{ context.app.config.options.mount_point }}:#{{ t_num }}]
+{% for ticket, change_text in data.changes %}
+ticket: [{{ context.app.config.options.mount_point }}:#{{ ticket.ticket_num }}] {{ ticket.summary }}
 
 {{ change_text }}
 {% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/25d07461/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 c21744c..23c0890 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1148,17 +1148,17 @@ class TestFunctionalController(TrackerTestController):
 - **Milestone**: 2.0
 
 '''
-        first_ticket_changes = '''ticket: [bugs:#1]
+        first_ticket_changes = '''ticket: [bugs:#1] test first ticket
 
 - **Owner**: Anonymous --> Test Admin
 - **Status**: open --> accepted
 '''
-        second_ticket_changes = '''ticket: [bugs:#2]
+        second_ticket_changes = '''ticket: [bugs:#2] test second ticket
 
 - **Owner**: Anonymous --> Test Admin
 - **Milestone**: 1.0 --> 2.0
 '''
-        third_ticket_changes = '''ticket: [bugs:#3]
+        third_ticket_changes = '''ticket: [bugs:#3] test third ticket
 
 - **Owner**: Anonymous --> Test Admin
 - **Status**: unread --> accepted

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/25d07461/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 396d300..8d786d9 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -852,7 +852,7 @@ class RootController(BaseController):
         users = M.User.query.find({'_id': {'$in': filtered_changes.keys()}}).all()
         def changes_iter(user):
             for t_id in filtered_changes.get(user._id, []):
-                yield (changed_tickets[t_id].ticket_num, changes[t_id])
+                yield (changed_tickets[t_id], changes[t_id])
         mail = dict(
             fromaddr = str(c.user._id),
             reply_to = str(c.user._id),
@@ -889,7 +889,7 @@ class RootController(BaseController):
             monitoring_email = c.app.config.options.get('TicketMonitoringEmail')
             def all_changes():
                 for t_id in changed_tickets.keys():
-                    yield (changed_tickets[t_id].ticket_num, changes[t_id])
+                    yield (changed_tickets[t_id], changes[t_id])
             tmpl_context['data'].update({'changes': all_changes()})
             mail.update(dict(
                 message_id = h.gen_message_id(),


[07/12] git commit: [#2502] ticket:300 Suppress comment notifications during mass edit

Posted by jo...@apache.org.
[#2502] ticket:300 Suppress comment notifications during mass edit


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

Branch: refs/heads/master
Commit: 201cc53bd6c075f85f3494af11fc9259e169f05b
Parents: e802cce
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 12 11:39:08 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/discuss.py            |    7 ++++---
 ForgeTracker/forgetracker/tracker_main.py |    2 +-
 2 files changed, 5 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/201cc53b/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index a59437b..76a9aa1 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -257,7 +257,7 @@ class Thread(Artifact, ActivityObject):
         if ignore_security or has_access(self, 'unmoderated_post')():
             log.info('Auto-approving message from %s', c.user.username)
             file_info = kw.get('file_info', None)
-            post.approve(file_info)
+            post.approve(file_info, notify=kw.get('notify', True))
         else:
             self.notify_moderators(post)
         return post
@@ -582,7 +582,7 @@ class Post(Message, VersionedArtifact, ActivityObject):
         super(Post, self).delete()
         self.thread.num_replies = max(0, self.thread.num_replies - 1)
 
-    def approve(self, file_info=None):
+    def approve(self, file_info=None, notify=True):
         if self.status == 'ok':
             return
         self.status = 'ok'
@@ -594,7 +594,8 @@ class Post(Message, VersionedArtifact, ActivityObject):
             and author._id != None):
             security.simple_grant(
                 self.acl, author.project_role()._id, 'unmoderated_post')
-        self.notify(file_info=file_info)
+        if notify:
+            self.notify(file_info=file_info)
         artifact = self.thread.artifact or self.thread
         session(self).flush()
         self.thread.last_post_date = max(

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/201cc53b/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index bb0fe7b..28c73ac 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -838,7 +838,7 @@ class RootController(BaseController):
                     new_value,
                     old_value)
             if message != '':
-                ticket.discussion_thread.post(message)
+                ticket.discussion_thread.post(message, notify=False)
                 ticket.commit()
         c.app.globals.invalidate_bin_counts()
         ThreadLocalORMSession.flush_all()


[05/12] git commit: [#2502] ticket:300 Use template for mass report

Posted by jo...@apache.org.
[#2502] ticket:300 Use template for mass report


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

Branch: refs/heads/master
Commit: 92f0595ff4261856773cf4b4e6390bdcfd3ad998
Parents: be38319
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Apr 16 10:55:03 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/data/mass_report         |    6 +++
 .../forgetracker/tests/functional/test_root.py     |   28 +++++++--------
 ForgeTracker/forgetracker/tracker_main.py          |   26 ++++++++------
 3 files changed, 34 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/92f0595f/ForgeTracker/forgetracker/data/mass_report
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/data/mass_report b/ForgeTracker/forgetracker/data/mass_report
new file mode 100644
index 0000000..629a1e2
--- /dev/null
+++ b/ForgeTracker/forgetracker/data/mass_report
@@ -0,0 +1,6 @@
+{{ data.header }}
+
+{% for t_num, change_text in data.changes %}
+ticket: [{{ context.app.config.options.mount_point }}:#{{ t_num }}]
+{{ change_text }}
+{% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/92f0595f/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 fe58a00..760f740 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1141,30 +1141,28 @@ class TestFunctionalController(TrackerTestController):
 
         # Expected data
         email_header = '''Mass edit changing:
-- **status**: accepted
-- **Milestone: 2.0
+- **Status**: accepted
+- **Milestone**: 2.0
+
 '''
         first_ticket_changes = '''ticket: [bugs:#1]
-- **status**: open --> accepted
-- **Milestone: 2.0 --> 2.0
+- **Status**: open --> accepted
 '''
         second_ticket_changes = '''ticket: [bugs:#2]
-- **status**: accepted --> accepted
-- **Milestone: 1.0 --> 2.0
+- **Milestone**: 1.0 --> 2.0
 '''
         third_ticket_changes = '''ticket: [bugs:#3]
-- **status**: unread --> accepted
-- **Milestone: --> 2.0
+- **Status**: unread --> accepted
+- **Milestone**: 1.0 --> 2.0
 '''
-        email = '\n'.join([email_header, first_ticket_changes])
+        email = u'\n'.join([email_header, first_ticket_changes, ''])
         assert_equal(email, first_user_email.kwargs.text)
-        email = '\n'.join([email_header, second_ticket_changes])
+        email = u'\n'.join([email_header, second_ticket_changes, ''])
         assert_equal(email, second_user_email.kwargs.text)
-        email = '\n'.join([email_header,
-                           first_ticket_changes,
-                           second_ticket_changes,
-                           third_ticket_changes])
-        assert_equal(email, admin_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 test_filtered_by_subscription(self):
         self.new_ticket(summary='test first ticket', status='open')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/92f0595f/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index dc2df43..132f9ec 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -24,6 +24,7 @@ from urllib2 import urlopen
 from webob import exc
 import json
 from itertools import ifilter, imap
+import jinja2
 
 # Non-stdlib imports
 import pkg_resources
@@ -37,6 +38,7 @@ from bson import ObjectId
 from bson.son import SON
 from bson.errors import InvalidId
 from webhelpers import feedgenerator as FG
+from paste.deploy.converters import asbool
 
 from ming import schema
 from ming.orm.ormsession import ThreadLocalORMSession
@@ -847,26 +849,28 @@ class RootController(BaseController):
                 ticket.commit()
         filtered_changes = filtered_by_subscription(changed_tickets)
         users = M.User.query.find({'_id': {'$in': filtered_changes.keys()}}).all()
+        def changes_iter(user):
+            for t_id in filtered_changes.get(user._id, []):
+                yield (changed_tickets[t_id].ticket_num, changes[t_id])
         mail = dict(
             fromaddr = str(c.user._id),
             reply_to = str(c.user._id),
-            message_id = h.gen_message_id(),
             subject = '[%s:%s] Mass edit changes by %s' % (c.project.shortname,
                                                            c.app.config.options.mount_point,
                                                            c.user.display_name),
         )
-        head = ['Mass edit changing:']
-        # TODO: add list with new values here
-        head = '\n'.join(head)
+        tmpl = jinja2.Environment(
+                loader=jinja2.PackageLoader('forgetracker', 'data'),
+                auto_reload=asbool(config.get('auto_reload_templates', True)),
+        ).get_template('mass_report')
+        head = ['- **%s**: %s' % (get_label(f), v) for f, v in values.iteritems()]
+        head += ['- **%s**: %s' % (get_label(f), v) for f, v in custom_values.iteritems()]
+        tmpl_context = {'context': c, 'data': {'header': '\n'.join(['Mass edit changing:'] + head)}}
         for user in users:
-            text = []
-            for t_id in filtered_changes.get(user._id, []):
-                text.append('ticket: [%s:#%d]' % (c.app.config.options.mount_point,
-                                                  changed_tickets[t_id].ticket_num))
-                text.append(changes[t_id])
-                text.append('')
+            tmpl_context['data'].update({'changes': changes_iter(user)})
             mail.update(dict(
-                text = head + '\n\n' +  '\n'.join(text),
+                message_id = h.gen_message_id(),
+                text = tmpl.render(tmpl_context),
                 destinations = [str(user._id)]))
             mail_tasks.sendmail.post(**mail)
             # TODO: send summary on ticket's monitoring email


[04/12] git commit: [#2502] ticket:300 Send mass edit reports

Posted by jo...@apache.org.
[#2502] ticket:300 Send mass edit reports


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

Branch: refs/heads/master
Commit: be383197f85a2bfa4e5e2560d91d33733c993a7f
Parents: e843f9f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 12 13:59:12 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:27 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |    8 ++--
 ForgeTracker/forgetracker/tracker_main.py          |   30 +++++++++++++++
 2 files changed, 34 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/be383197/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 566f534..fe58a00 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1119,22 +1119,22 @@ class TestFunctionalController(TrackerTestController):
         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 edit changes')
+            assert_equal(email.kwargs.subject, '[test:bugs] Mass edit changes by Test Admin')
         first_user_email = M.MonQTask.query.find({
             'task_name': 'allura.tasks.mail_tasks.sendmail',
-            'kwargs.destinations': first_user._id
+            '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': second_user._id
+            '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': admin._id
+            'kwargs.destinations': str(admin._id)
         }).all()
         assert_equal(len(admin_email), 1)
         admin_email = admin_email[0]

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/be383197/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 7ea8693..dc2df43 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -59,6 +59,7 @@ from allura.lib.zarkov_helpers import zero_fill_zarkov_result
 from allura.controllers import AppDiscussionController, AppDiscussionRestController
 from allura.controllers import attachments as ac
 from allura.controllers import BaseController
+from allura.tasks import mail_tasks
 
 # Local imports
 from forgetracker import model as TM
@@ -807,6 +808,8 @@ class RootController(BaseController):
                 custom_values[cf.name] = v
                 custom_fields[cf.name] = cf
 
+        changes = {}
+        changed_tickets = {}
         for ticket in tickets:
             message = ''
             for k, v in values.iteritems():
@@ -838,8 +841,35 @@ class RootController(BaseController):
                     new_value,
                     old_value)
             if message != '':
+                changes[ticket._id] = message
+                changed_tickets[ticket._id] = ticket
                 ticket.discussion_thread.post(message, notify=False)
                 ticket.commit()
+        filtered_changes = filtered_by_subscription(changed_tickets)
+        users = M.User.query.find({'_id': {'$in': filtered_changes.keys()}}).all()
+        mail = dict(
+            fromaddr = str(c.user._id),
+            reply_to = str(c.user._id),
+            message_id = h.gen_message_id(),
+            subject = '[%s:%s] Mass edit changes by %s' % (c.project.shortname,
+                                                           c.app.config.options.mount_point,
+                                                           c.user.display_name),
+        )
+        head = ['Mass edit changing:']
+        # TODO: add list with new values here
+        head = '\n'.join(head)
+        for user in users:
+            text = []
+            for t_id in filtered_changes.get(user._id, []):
+                text.append('ticket: [%s:#%d]' % (c.app.config.options.mount_point,
+                                                  changed_tickets[t_id].ticket_num))
+                text.append(changes[t_id])
+                text.append('')
+            mail.update(dict(
+                text = head + '\n\n' +  '\n'.join(text),
+                destinations = [str(user._id)]))
+            mail_tasks.sendmail.post(**mail)
+            # TODO: send summary on ticket's monitoring email
         c.app.globals.invalidate_bin_counts()
         ThreadLocalORMSession.flush_all()
         count = len(tickets)


[02/12] git commit: [#2502] ticket:300 Test summary emails for bulk edit

Posted by jo...@apache.org.
[#2502] ticket:300 Test summary emails for bulk edit


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

Branch: refs/heads/master
Commit: 02b97b552eddb1fee3ea5900fd85468bccb37f94
Parents: 4ac36f9
Author: Igor Bondarenko <je...@gmail.com>
Authored: Thu Apr 11 10:07:51 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Apr 22 19:40:26 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |   52 +++++++++++++++
 1 files changed, 52 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/02b97b55/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 bd6744c..3d1f14c 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1089,6 +1089,58 @@ class TestFunctionalController(TrackerTestController):
         assert_in('test second ticket', str(ticket_rows))
         assert_false('test third ticket' in str(ticket_rows))
 
+    def test_bulk_edit_notifications(self):
+        self.new_ticket(summary='test first ticket', status='open')
+        self.new_ticket(summary='test second ticket', status='open')
+        self.new_ticket(summary='test third ticket', status='open')
+        ThreadLocalORMSession.flush_all()
+        M.MonQTask.run_ready()
+        ThreadLocalORMSession.flush_all()
+        first_ticket = tm.Ticket.query.get(summary='test first ticket')
+        second_ticket = tm.Ticket.query.get(summary='test second ticket')
+        third_ticket = tm.Ticket.query.get(summary='test third ticket')
+        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')
+        first_ticket.subscribe(user=first_user)
+        second_ticket.subscribe(user=second_user)
+        M.MonQTask.query.remove()
+        self.app.post('/p/test/bugs/update_tickets', {
+                      '__search': '',
+                      '__ticket_ids': (
+                          first_ticket._id,
+                          second_ticket._id,
+                          third_ticket._id),
+                      'status': 'accepted'})
+        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] Bulk edit report')
+            assert_in('- **Status**: open --> accepted\n', email.kwargs.text)
+        first_user_email = M.MonQTask.query.find({
+            'task_name': 'allura.tasks.mail_tasks.sendmail',
+            'kwargs.destinations': 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': 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': admin._id
+        }).all()
+        assert_equal(len(admin_email), 1)
+        admin_email = admin_email[0]
+
+        # TODO: check email text for first, second and admin users
+        #assert_in('### Affected tickets\n\n- [bugs:#1] test first ticket', first_user_email.kwargs.text)
+
     def test_vote(self):
         r = self.new_ticket(summary='test vote').follow()
         assert_false(r.html.find('div', {'id': 'vote'}))