Merge lp:~thumper/launchpad/less-wip-emails into lp:launchpad
- less-wip-emails
- Merge into devel
Status: | Merged |
---|---|
Approved by: | Tim Penhey |
Approved revision: | no longer in the source branch. |
Merged at revision: | 11826 |
Proposed branch: | lp:~thumper/launchpad/less-wip-emails |
Merge into: | lp:launchpad |
Diff against target: |
330 lines (+117/-55) 3 files modified
lib/lp/code/mail/tests/test_branchmergeproposal.py (+100/-52) lib/lp/code/model/tests/test_branchmergeproposaljobs.py (+4/-2) lib/lp/code/subscribers/branchmergeproposal.py (+13/-1) |
To merge this branch: | bzr merge lp:~thumper/launchpad/less-wip-emails |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jeroen T. Vermeulen (community) | code | Approve | |
Review via email: mp+39489@code.launchpad.net |
Commit message
Don't send email for work in progress merge proposals when requesting reviews or modifying the proposal.
Description of the change
During the QA of the change where the initial code review email doesn't go out for work in progress merge proposals, it became clear that we should be suppressing other emails, for example the review requests while work in progress, and the state change emails.
This means we won't get an email that says WIP -> Needs Review, followed by the initial review email, we'll just get the initial review email.
Also all of the reviewers get the initial review request, so extra review request emails don't go out when the proposal is work in progress.
tests:
code.
There was also some test refactoring to have the tests use updated factory methods instead of rolling their own.
Preview Diff
1 | === modified file 'lib/lp/code/mail/tests/test_branchmergeproposal.py' | |||
2 | --- lib/lp/code/mail/tests/test_branchmergeproposal.py 2010-10-04 19:50:45 +0000 | |||
3 | +++ lib/lp/code/mail/tests/test_branchmergeproposal.py 2010-10-28 22:34:49 +0000 | |||
4 | @@ -9,7 +9,9 @@ | |||
5 | 9 | from unittest import TestLoader | 9 | from unittest import TestLoader |
6 | 10 | 10 | ||
7 | 11 | from lazr.lifecycle.event import ObjectModifiedEvent | 11 | from lazr.lifecycle.event import ObjectModifiedEvent |
8 | 12 | from lazr.lifecycle.snapshot import Snapshot | ||
9 | 12 | import transaction | 13 | import transaction |
10 | 14 | from zope.interface import providedBy | ||
11 | 13 | from zope.security.proxy import removeSecurityProxy | 15 | from zope.security.proxy import removeSecurityProxy |
12 | 14 | 16 | ||
13 | 15 | from canonical.launchpad.interfaces.lpstorm import IStore | 17 | from canonical.launchpad.interfaces.lpstorm import IStore |
14 | @@ -18,8 +20,8 @@ | |||
15 | 18 | DatabaseFunctionalLayer, | 20 | DatabaseFunctionalLayer, |
16 | 19 | LaunchpadFunctionalLayer, | 21 | LaunchpadFunctionalLayer, |
17 | 20 | ) | 22 | ) |
18 | 21 | from lp.code.adapters.branch import BranchMergeProposalDelta | ||
19 | 22 | from lp.code.enums import ( | 23 | from lp.code.enums import ( |
20 | 24 | BranchMergeProposalStatus, | ||
21 | 23 | BranchSubscriptionNotificationLevel, | 25 | BranchSubscriptionNotificationLevel, |
22 | 24 | CodeReviewNotificationLevel, | 26 | CodeReviewNotificationLevel, |
23 | 25 | ) | 27 | ) |
24 | @@ -36,7 +38,7 @@ | |||
25 | 36 | from lp.code.model.diff import PreviewDiff | 38 | from lp.code.model.diff import PreviewDiff |
26 | 37 | from lp.code.subscribers.branchmergeproposal import merge_proposal_modified | 39 | from lp.code.subscribers.branchmergeproposal import merge_proposal_modified |
27 | 38 | from lp.testing import ( | 40 | from lp.testing import ( |
29 | 39 | login_person, | 41 | person_logged_in, |
30 | 40 | TestCaseWithFactory, | 42 | TestCaseWithFactory, |
31 | 41 | ) | 43 | ) |
32 | 42 | from lp.testing.mail_helpers import pop_notifications | 44 | from lp.testing.mail_helpers import pop_notifications |
33 | @@ -51,7 +53,9 @@ | |||
34 | 51 | super(TestMergeProposalMailing, self).setUp('admin@canonical.com') | 53 | super(TestMergeProposalMailing, self).setUp('admin@canonical.com') |
35 | 52 | 54 | ||
36 | 53 | def makeProposalWithSubscriber(self, diff_text=None, | 55 | def makeProposalWithSubscriber(self, diff_text=None, |
38 | 54 | initial_comment=None, prerequisite=False): | 56 | initial_comment=None, |
39 | 57 | prerequisite=False, | ||
40 | 58 | needs_review=True): | ||
41 | 55 | if diff_text is not None: | 59 | if diff_text is not None: |
42 | 56 | preview_diff = PreviewDiff.create( | 60 | preview_diff = PreviewDiff.create( |
43 | 57 | diff_text, | 61 | diff_text, |
44 | @@ -68,8 +72,13 @@ | |||
45 | 68 | prerequisite_branch = self.factory.makeProductBranch(product) | 72 | prerequisite_branch = self.factory.makeProductBranch(product) |
46 | 69 | else: | 73 | else: |
47 | 70 | prerequisite_branch = None | 74 | prerequisite_branch = None |
48 | 75 | if needs_review: | ||
49 | 76 | initial_status = BranchMergeProposalStatus.NEEDS_REVIEW | ||
50 | 77 | else: | ||
51 | 78 | initial_status = BranchMergeProposalStatus.WORK_IN_PROGRESS | ||
52 | 71 | bmp = self.factory.makeBranchMergeProposal( | 79 | bmp = self.factory.makeBranchMergeProposal( |
53 | 72 | registrant=registrant, product=product, | 80 | registrant=registrant, product=product, |
54 | 81 | set_state=initial_status, | ||
55 | 73 | prerequisite_branch=prerequisite_branch, | 82 | prerequisite_branch=prerequisite_branch, |
56 | 74 | preview_diff=preview_diff, initial_comment=initial_comment) | 83 | preview_diff=preview_diff, initial_comment=initial_comment) |
57 | 75 | subscriber = self.factory.makePerson(displayname='Baz Quxx', | 84 | subscriber = self.factory.makePerson(displayname='Baz Quxx', |
58 | @@ -308,16 +317,44 @@ | |||
59 | 308 | def test_no_job_created_if_no_delta(self): | 317 | def test_no_job_created_if_no_delta(self): |
60 | 309 | """Ensure None is returned if no change has been made.""" | 318 | """Ensure None is returned if no change has been made.""" |
61 | 310 | merge_proposal, person = self.makeProposalWithSubscriber() | 319 | merge_proposal, person = self.makeProposalWithSubscriber() |
67 | 311 | old_merge_proposal = BranchMergeProposalDelta.snapshot(merge_proposal) | 320 | old_merge_proposal = Snapshot( |
68 | 312 | event = ObjectModifiedEvent( | 321 | merge_proposal, providing=providedBy(merge_proposal)) |
69 | 313 | merge_proposal, old_merge_proposal, [], merge_proposal.registrant) | 322 | event = ObjectModifiedEvent( |
70 | 314 | merge_proposal_modified(merge_proposal, event) | 323 | merge_proposal, old_merge_proposal, [], merge_proposal.registrant) |
71 | 315 | self.assertIs(None, self.getProposalUpdatedEmailJob(merge_proposal)) | 324 | merge_proposal_modified(merge_proposal, event) |
72 | 325 | self.assertIs(None, self.getProposalUpdatedEmailJob(merge_proposal)) | ||
73 | 326 | |||
74 | 327 | def test_no_job_created_if_work_in_progress(self): | ||
75 | 328 | """Ensure None is returned if no change has been made.""" | ||
76 | 329 | merge_proposal, person = self.makeProposalWithSubscriber( | ||
77 | 330 | needs_review=False) | ||
78 | 331 | old_merge_proposal = Snapshot( | ||
79 | 332 | merge_proposal, providing=providedBy(merge_proposal)) | ||
80 | 333 | merge_proposal.commit_message = 'new commit message' | ||
81 | 334 | merge_proposal.description = 'change description' | ||
82 | 335 | event = ObjectModifiedEvent( | ||
83 | 336 | merge_proposal, old_merge_proposal, [], merge_proposal.registrant) | ||
84 | 337 | merge_proposal_modified(merge_proposal, event) | ||
85 | 338 | self.assertIs(None, self.getProposalUpdatedEmailJob(merge_proposal)) | ||
86 | 339 | |||
87 | 340 | def test_job_created_if_work_in_progress_merged(self): | ||
88 | 341 | # If work in progress is merged, then that is email worthy. | ||
89 | 342 | merge_proposal, person = self.makeProposalWithSubscriber( | ||
90 | 343 | needs_review=False) | ||
91 | 344 | old_merge_proposal = Snapshot( | ||
92 | 345 | merge_proposal, providing=providedBy(merge_proposal)) | ||
93 | 346 | merge_proposal.setStatus(BranchMergeProposalStatus.MERGED) | ||
94 | 347 | event = ObjectModifiedEvent( | ||
95 | 348 | merge_proposal, old_merge_proposal, [], merge_proposal.registrant) | ||
96 | 349 | merge_proposal_modified(merge_proposal, event) | ||
97 | 350 | job = self.getProposalUpdatedEmailJob(merge_proposal) | ||
98 | 351 | self.assertIsNot(None, job, 'Job was not created.') | ||
99 | 316 | 352 | ||
100 | 317 | def makeProposalUpdatedEmailJob(self): | 353 | def makeProposalUpdatedEmailJob(self): |
101 | 318 | """Fixture method providing a mailer for a modified merge proposal""" | 354 | """Fixture method providing a mailer for a modified merge proposal""" |
102 | 319 | merge_proposal, subscriber = self.makeProposalWithSubscriber() | 355 | merge_proposal, subscriber = self.makeProposalWithSubscriber() |
104 | 320 | old_merge_proposal = BranchMergeProposalDelta.snapshot(merge_proposal) | 356 | old_merge_proposal = Snapshot( |
105 | 357 | merge_proposal, providing=providedBy(merge_proposal)) | ||
106 | 321 | merge_proposal.requestReview() | 358 | merge_proposal.requestReview() |
107 | 322 | merge_proposal.commit_message = 'new commit message' | 359 | merge_proposal.commit_message = 'new commit message' |
108 | 323 | merge_proposal.description = 'change description' | 360 | merge_proposal.description = 'change description' |
109 | @@ -339,7 +376,6 @@ | |||
110 | 339 | """Ensure the right delta is filled out if there is a change.""" | 376 | """Ensure the right delta is filled out if there is a change.""" |
111 | 340 | job, subscriber = self.makeProposalUpdatedEmailJob() | 377 | job, subscriber = self.makeProposalUpdatedEmailJob() |
112 | 341 | self.assertEqual( | 378 | self.assertEqual( |
113 | 342 | ' Status: Work in progress => Needs review\n\n' | ||
114 | 343 | 'Commit Message changed to:\n\nnew commit message\n\n' | 379 | 'Commit Message changed to:\n\nnew commit message\n\n' |
115 | 344 | 'Description changed to:\n\nchange description', | 380 | 'Description changed to:\n\nchange description', |
116 | 345 | job.delta_text) | 381 | job.delta_text) |
117 | @@ -363,8 +399,6 @@ | |||
118 | 363 | expected = dedent("""\ | 399 | expected = dedent("""\ |
119 | 364 | The proposal to merge lp://dev/~bob/super-product/fix-foo-for-bar into lp://dev/~mary/super-product/bar has been updated. | 400 | The proposal to merge lp://dev/~bob/super-product/fix-foo-for-bar into lp://dev/~mary/super-product/bar has been updated. |
120 | 365 | 401 | ||
121 | 366 | Status: Work in progress => Needs review | ||
122 | 367 | |||
123 | 368 | Commit Message changed to: | 402 | Commit Message changed to: |
124 | 369 | 403 | ||
125 | 370 | new commit message | 404 | new commit message |
126 | @@ -431,52 +465,63 @@ | |||
127 | 431 | 465 | ||
128 | 432 | layer = DatabaseFunctionalLayer | 466 | layer = DatabaseFunctionalLayer |
129 | 433 | 467 | ||
145 | 434 | def setUp(self): | 468 | def getReviewEmailJobs(self, bmp): |
146 | 435 | TestCaseWithFactory.setUp(self) | 469 | """Return the result set for the merge proposals review email jobs.""" |
147 | 436 | self.owner = self.factory.makePerson() | 470 | review_job = BranchMergeProposalJobType.REVIEW_REQUEST_EMAIL |
148 | 437 | login_person(self.owner) | 471 | return IStore(BranchMergeProposalJob).find( |
149 | 438 | self.bmp = self.factory.makeBranchMergeProposal(registrant=self.owner) | 472 | BranchMergeProposalJob, |
150 | 439 | 473 | BranchMergeProposalJob.branch_merge_proposal == bmp, | |
151 | 440 | def makePersonWithHiddenEmail(self): | 474 | BranchMergeProposalJob.job_type == review_job) |
152 | 441 | """Make an arbitrary person with hidden email addresses.""" | 475 | |
153 | 442 | person = self.factory.makePerson() | 476 | def getReviewNotificationEmail(self, bmp): |
139 | 443 | login_person(person) | ||
140 | 444 | person.hide_email_addresses = True | ||
141 | 445 | login_person(self.owner) | ||
142 | 446 | return person | ||
143 | 447 | |||
144 | 448 | def getReviewNotificationEmail(self): | ||
154 | 449 | """Return the review requested email job for the test's proposal.""" | 477 | """Return the review requested email job for the test's proposal.""" |
161 | 450 | [job] = list( | 478 | [job] = list(self.getReviewEmailJobs(bmp)) |
156 | 451 | IStore(BranchMergeProposalJob).find( | ||
157 | 452 | BranchMergeProposalJob, | ||
158 | 453 | BranchMergeProposalJob.branch_merge_proposal == self.bmp, | ||
159 | 454 | BranchMergeProposalJob.job_type == | ||
160 | 455 | BranchMergeProposalJobType.REVIEW_REQUEST_EMAIL)) | ||
162 | 456 | return ReviewRequestedEmailJob(job) | 479 | return ReviewRequestedEmailJob(job) |
163 | 457 | 480 | ||
164 | 481 | def test_nominateReview_no_job_if_work_in_progress(self): | ||
165 | 482 | # When a reviewer is nominated for a proposal that is work in | ||
166 | 483 | # progress, no email job is created. | ||
167 | 484 | bmp = self.factory.makeBranchMergeProposal( | ||
168 | 485 | set_state=BranchMergeProposalStatus.WORK_IN_PROGRESS) | ||
169 | 486 | reviewer = self.factory.makePerson() | ||
170 | 487 | pop_notifications() | ||
171 | 488 | with person_logged_in(bmp.registrant): | ||
172 | 489 | bmp.nominateReviewer(reviewer, bmp.registrant, None) | ||
173 | 490 | # No email is sent. | ||
174 | 491 | sent_mail = pop_notifications() | ||
175 | 492 | self.assertEqual([], sent_mail) | ||
176 | 493 | # No job created. | ||
177 | 494 | job_count = self.getReviewEmailJobs(bmp).count() | ||
178 | 495 | self.assertEqual(0, job_count) | ||
179 | 496 | |||
180 | 458 | def test_nominateReview_creates_job(self): | 497 | def test_nominateReview_creates_job(self): |
181 | 459 | # When a reviewer is nominated, a job is created to send out the | 498 | # When a reviewer is nominated, a job is created to send out the |
182 | 460 | # review request email. | 499 | # review request email. |
183 | 500 | bmp = self.factory.makeBranchMergeProposal( | ||
184 | 501 | set_state=BranchMergeProposalStatus.NEEDS_REVIEW) | ||
185 | 461 | reviewer = self.factory.makePerson() | 502 | reviewer = self.factory.makePerson() |
186 | 462 | pop_notifications() | 503 | pop_notifications() |
188 | 463 | self.bmp.nominateReviewer(reviewer, self.owner, None) | 504 | with person_logged_in(bmp.registrant): |
189 | 505 | bmp.nominateReviewer(reviewer, bmp.registrant, None) | ||
190 | 464 | # No email is sent. | 506 | # No email is sent. |
191 | 465 | sent_mail = pop_notifications() | 507 | sent_mail = pop_notifications() |
192 | 466 | self.assertEqual([], sent_mail) | 508 | self.assertEqual([], sent_mail) |
193 | 467 | # A job is created. | 509 | # A job is created. |
196 | 468 | review_request_job = self.getReviewNotificationEmail() | 510 | review_request_job = self.getReviewNotificationEmail(bmp) |
197 | 469 | self.assertEqual(self.bmp, review_request_job.branch_merge_proposal) | 511 | self.assertEqual(bmp, review_request_job.branch_merge_proposal) |
198 | 470 | self.assertEqual(reviewer, review_request_job.reviewer) | 512 | self.assertEqual(reviewer, review_request_job.reviewer) |
200 | 471 | self.assertEqual(self.bmp.registrant, review_request_job.requester) | 513 | self.assertEqual(bmp.registrant, review_request_job.requester) |
201 | 472 | 514 | ||
202 | 473 | def test_nominateReview_email_content(self): | 515 | def test_nominateReview_email_content(self): |
203 | 474 | # The email that is sent contains the description of the proposal, and | 516 | # The email that is sent contains the description of the proposal, and |
204 | 475 | # a link to the proposal. | 517 | # a link to the proposal. |
205 | 518 | bmp = self.factory.makeBranchMergeProposal( | ||
206 | 519 | set_state=BranchMergeProposalStatus.NEEDS_REVIEW) | ||
207 | 476 | reviewer = self.factory.makePerson() | 520 | reviewer = self.factory.makePerson() |
211 | 477 | self.bmp.description = 'This branch is awesome.' | 521 | with person_logged_in(bmp.registrant): |
212 | 478 | self.bmp.nominateReviewer(reviewer, self.owner, None) | 522 | bmp.description = 'This branch is awesome.' |
213 | 479 | review_request_job = self.getReviewNotificationEmail() | 523 | bmp.nominateReviewer(reviewer, bmp.registrant, None) |
214 | 524 | review_request_job = self.getReviewNotificationEmail(bmp) | ||
215 | 480 | review_request_job.run() | 525 | review_request_job.run() |
216 | 481 | [sent_mail] = pop_notifications() | 526 | [sent_mail] = pop_notifications() |
217 | 482 | expected = dedent("""\ | 527 | expected = dedent("""\ |
218 | @@ -488,25 +533,25 @@ | |||
219 | 488 | %(bmp)s | 533 | %(bmp)s |
220 | 489 | You are requested to review the proposed merge of %(source)s into %(target)s. | 534 | You are requested to review the proposed merge of %(source)s into %(target)s. |
221 | 490 | """ % { | 535 | """ % { |
225 | 491 | 'source': self.bmp.source_branch.bzr_identity, | 536 | 'source': bmp.source_branch.bzr_identity, |
226 | 492 | 'target': self.bmp.target_branch.bzr_identity, | 537 | 'target': bmp.target_branch.bzr_identity, |
227 | 493 | 'bmp': canonical_url(self.bmp)}) | 538 | 'bmp': canonical_url(bmp)}) |
228 | 494 | self.assertEqual(expected, sent_mail.get_payload(decode=True)) | 539 | self.assertEqual(expected, sent_mail.get_payload(decode=True)) |
229 | 495 | 540 | ||
230 | 496 | def test_nominateReview_emails_team_address(self): | 541 | def test_nominateReview_emails_team_address(self): |
231 | 497 | # If a review request is made for a team, the members of the team are | 542 | # If a review request is made for a team, the members of the team are |
232 | 498 | # sent an email. | 543 | # sent an email. |
233 | 544 | bmp = self.factory.makeBranchMergeProposal( | ||
234 | 545 | set_state=BranchMergeProposalStatus.NEEDS_REVIEW) | ||
235 | 499 | eric = self.factory.makePerson( | 546 | eric = self.factory.makePerson( |
236 | 500 | displayname='Eric the Viking', email='eric@vikings.example.com') | 547 | displayname='Eric the Viking', email='eric@vikings.example.com') |
237 | 501 | black_beard = self.factory.makePerson( | 548 | black_beard = self.factory.makePerson( |
238 | 502 | displayname='Black Beard', email='black@pirates.example.com') | 549 | displayname='Black Beard', email='black@pirates.example.com') |
242 | 503 | review_team = self.factory.makeTeam(owner=eric) | 550 | review_team = self.factory.makeTeam(owner=eric, members=[black_beard]) |
240 | 504 | login_person(eric) | ||
241 | 505 | review_team.addMember(black_beard, eric) | ||
243 | 506 | pop_notifications() | 551 | pop_notifications() |
247 | 507 | login_person(self.owner) | 552 | with person_logged_in(bmp.registrant): |
248 | 508 | self.bmp.nominateReviewer(review_team, self.owner, None) | 553 | bmp.nominateReviewer(review_team, bmp.registrant, None) |
249 | 509 | review_request_job = self.getReviewNotificationEmail() | 554 | review_request_job = self.getReviewNotificationEmail(bmp) |
250 | 510 | review_request_job.run() | 555 | review_request_job.run() |
251 | 511 | sent_mail = pop_notifications() | 556 | sent_mail = pop_notifications() |
252 | 512 | self.assertEqual( | 557 | self.assertEqual( |
253 | @@ -517,11 +562,14 @@ | |||
254 | 517 | def test_requestReviewWithPrivateEmail(self): | 562 | def test_requestReviewWithPrivateEmail(self): |
255 | 518 | # We can request a review, even when one of the parties involved has a | 563 | # We can request a review, even when one of the parties involved has a |
256 | 519 | # private email address. | 564 | # private email address. |
258 | 520 | candidate = self.makePersonWithHiddenEmail() | 565 | bmp = self.factory.makeBranchMergeProposal( |
259 | 566 | set_state=BranchMergeProposalStatus.NEEDS_REVIEW) | ||
260 | 567 | candidate = self.factory.makePerson(hide_email_addresses=True) | ||
261 | 521 | # Request a review and prepare the mailer. | 568 | # Request a review and prepare the mailer. |
263 | 522 | self.bmp.nominateReviewer(candidate, self.owner, None) | 569 | with person_logged_in(bmp.registrant): |
264 | 570 | bmp.nominateReviewer(candidate, bmp.registrant, None) | ||
265 | 523 | # Send the mail. | 571 | # Send the mail. |
267 | 524 | review_request_job = self.getReviewNotificationEmail() | 572 | review_request_job = self.getReviewNotificationEmail(bmp) |
268 | 525 | review_request_job.run() | 573 | review_request_job.run() |
269 | 526 | mails = pop_notifications() | 574 | mails = pop_notifications() |
270 | 527 | self.assertEqual(1, len(mails)) | 575 | self.assertEqual(1, len(mails)) |
271 | 528 | 576 | ||
272 | === modified file 'lib/lp/code/model/tests/test_branchmergeproposaljobs.py' | |||
273 | --- lib/lp/code/model/tests/test_branchmergeproposaljobs.py 2010-10-26 15:47:24 +0000 | |||
274 | +++ lib/lp/code/model/tests/test_branchmergeproposaljobs.py 2010-10-28 22:34:49 +0000 | |||
275 | @@ -357,7 +357,8 @@ | |||
276 | 357 | 357 | ||
277 | 358 | def test_iterReady_supports_review_requested(self): | 358 | def test_iterReady_supports_review_requested(self): |
278 | 359 | # iterReady will also return pending ReviewRequestedEmailJobs. | 359 | # iterReady will also return pending ReviewRequestedEmailJobs. |
280 | 360 | bmp = self.makeBranchMergeProposal() | 360 | bmp = self.makeBranchMergeProposal( |
281 | 361 | set_state=BranchMergeProposalStatus.NEEDS_REVIEW) | ||
282 | 361 | self.completePendingJobs() | 362 | self.completePendingJobs() |
283 | 362 | reviewer = self.factory.makePerson() | 363 | reviewer = self.factory.makePerson() |
284 | 363 | bmp.nominateReviewer(reviewer, bmp.registrant) | 364 | bmp.nominateReviewer(reviewer, bmp.registrant) |
285 | @@ -380,7 +381,8 @@ | |||
286 | 380 | 381 | ||
287 | 381 | def test_iterReady_supports_updated_emails(self): | 382 | def test_iterReady_supports_updated_emails(self): |
288 | 382 | # iterReady will also return pending MergeProposalUpdatedEmailJob. | 383 | # iterReady will also return pending MergeProposalUpdatedEmailJob. |
290 | 383 | bmp = self.makeBranchMergeProposal() | 384 | bmp = self.makeBranchMergeProposal( |
291 | 385 | set_state=BranchMergeProposalStatus.NEEDS_REVIEW) | ||
292 | 384 | self.completePendingJobs() | 386 | self.completePendingJobs() |
293 | 385 | old_merge_proposal = BranchMergeProposalDelta.snapshot(bmp) | 387 | old_merge_proposal = BranchMergeProposalDelta.snapshot(bmp) |
294 | 386 | bmp.commit_message = 'new commit message' | 388 | bmp.commit_message = 'new commit message' |
295 | 387 | 389 | ||
296 | === modified file 'lib/lp/code/subscribers/branchmergeproposal.py' | |||
297 | --- lib/lp/code/subscribers/branchmergeproposal.py 2010-10-18 03:39:28 +0000 | |||
298 | +++ lib/lp/code/subscribers/branchmergeproposal.py 2010-10-28 22:34:49 +0000 | |||
299 | @@ -10,6 +10,7 @@ | |||
300 | 10 | from zope.component import getUtility | 10 | from zope.component import getUtility |
301 | 11 | 11 | ||
302 | 12 | from lp.code.adapters.branch import BranchMergeProposalDelta | 12 | from lp.code.adapters.branch import BranchMergeProposalDelta |
303 | 13 | from lp.code.enums import BranchMergeProposalStatus | ||
304 | 13 | from lp.code.interfaces.branchmergeproposal import ( | 14 | from lp.code.interfaces.branchmergeproposal import ( |
305 | 14 | IMergeProposalNeedsReviewEmailJobSource, | 15 | IMergeProposalNeedsReviewEmailJobSource, |
306 | 15 | IMergeProposalUpdatedEmailJobSource, | 16 | IMergeProposalUpdatedEmailJobSource, |
307 | @@ -48,6 +49,14 @@ | |||
308 | 48 | from_person = None | 49 | from_person = None |
309 | 49 | else: | 50 | else: |
310 | 50 | from_person = IPerson(event.user) | 51 | from_person = IPerson(event.user) |
311 | 52 | # If the merge proposal was work in progress, then we don't want to send | ||
312 | 53 | # out an email as the needs review email will cover that. | ||
313 | 54 | old_status = event.object_before_modification.queue_status | ||
314 | 55 | if old_status == BranchMergeProposalStatus.WORK_IN_PROGRESS: | ||
315 | 56 | # Unless the new status is merged. If this occurs we really should | ||
316 | 57 | # send out an email. | ||
317 | 58 | if merge_proposal.queue_status != BranchMergeProposalStatus.MERGED: | ||
318 | 59 | return | ||
319 | 51 | # Create a delta of the changes. If there are no changes to report, then | 60 | # Create a delta of the changes. If there are no changes to report, then |
320 | 52 | # we're done. | 61 | # we're done. |
321 | 53 | delta = BranchMergeProposalDelta.construct( | 62 | delta = BranchMergeProposalDelta.construct( |
322 | @@ -63,5 +72,8 @@ | |||
323 | 63 | 72 | ||
324 | 64 | def review_requested(vote_reference, event): | 73 | def review_requested(vote_reference, event): |
325 | 65 | """Notify the reviewer that they have been requested to review.""" | 74 | """Notify the reviewer that they have been requested to review.""" |
327 | 66 | getUtility(IReviewRequestedEmailJobSource).create(vote_reference) | 75 | # Don't send email if the proposal is work in progress. |
328 | 76 | bmp_status = vote_reference.branch_merge_proposal.queue_status | ||
329 | 77 | if bmp_status != BranchMergeProposalStatus.WORK_IN_PROGRESS: | ||
330 | 78 | getUtility(IReviewRequestedEmailJobSource).create(vote_reference) | ||
331 | 67 | 79 |
Looks good. Only the slightest of superficial remarks. To recap from IRC, "there is no email job created" isn't very nice to read; "with person_ logged_ in(...) " would probably make a few tests a bit cleaner; the final condition in the IStore.find() isn't sufficiently indented.