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 18:01:26 UTC
[34/50] 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/5913
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)