mozreview: Add functions to get diff URLs to rb_utils (bug 1226080); r?glob draft
authorMark Cote <mcote@mozilla.com>
Fri, 22 Jul 2016 15:48:29 -0400
changeset 9109 f0af120be88cc9dfbea1f37dd5cb750e68b14958
parent 9108 d8d5f93b2b5a1b0e1a4c4530f059830b2d3d72f2
child 9110 df7e88018d34408749060e1fe9b1f1e9650b75b1
push id1083
push usermcote@mozilla.com
push dateWed, 03 Aug 2016 20:51:40 +0000
reviewersglob
bugs1226080
mozreview: Add functions to get diff URLs to rb_utils (bug 1226080); r?glob Getting a diff URL from a review request or a review request URL is a common operation. MozReview-Commit-ID: Fk70PQPxaur
pylib/mozreview/mozreview/bugzilla/client.py
pylib/mozreview/mozreview/rb_utils.py
pylib/mozreview/mozreview/signal_handlers.py
--- a/pylib/mozreview/mozreview/bugzilla/client.py
+++ b/pylib/mozreview/mozreview/bugzilla/client.py
@@ -10,17 +10,21 @@ from urlparse import urlparse, urlunpars
 
 from django.contrib.auth.models import User
 from djblets.siteconfig.models import SiteConfiguration
 from djblets.util.decorators import simple_decorator
 
 from mozreview.bugzilla.errors import BugzillaError, BugzillaUrlError
 from mozreview.bugzilla.models import get_or_create_bugzilla_users
 from mozreview.bugzilla.transports import bugzilla_transport
-from mozreview.rb_utils import get_obj_url
+from mozreview.rb_utils import (
+    get_diff_url,
+    get_diff_url_from_rr_url,
+    get_obj_url,
+)
 
 from mozautomation.commitparser import (
     replace_reviewers,
     strip_commit_metadata,
 )
 
 
 logger = logging.getLogger(__name__)
@@ -93,17 +97,17 @@ class BugzillaAttachmentUpdates(object):
                 'status': 'X'
             }
         """
 
         logger.info('Posting review request %s to bug %d.' %
                     (review_request.id, self.bug_id))
 
         rr_url = get_obj_url(review_request)
-        diff_url = self._get_diff_url(review_request)
+        diff_url = get_diff_url(review_request)
 
         # Build the comment.  Only post a comment if the diffset has
         # actually changed.
         comment = ''
         if review_request_draft.get_latest_diffset():
             diffset_count = review_request.diffset_history.diffsets.count()
             if diffset_count < 1:
                 # We don't need the first line, since it is also the attachment
@@ -207,34 +211,31 @@ class BugzillaAttachmentUpdates(object):
 
     def get_attachment(self, review_request):
         """Return the attachment for the specified review request.
 
         Returns `None` if an attachment hasn't yet been created for the
         review request.
         """
         self._update_attachments()
-        url = self._get_diff_url(review_request)
+        url = get_diff_url(review_request)
 
         for a in self.attachments:
             # Make sure we check for old-style URLs as well.
             if not self.bugzilla._rb_attach_url_matches(a['data'], url):
                 continue
 
             return a
 
         return None
 
     def _update_attachments(self):
         if not self.attachments:
             self.attachments = self.bugzilla.get_rb_attachments(self.bug_id)
 
-    def _get_diff_url(self, review_request):
-        return '%sdiff/#index_header' % get_obj_url(review_request)
-
 
 class Bugzilla(object):
     """
     Interface to a Bugzilla system.
 
     At the moment this uses the XMLRPC API.  It should probably be converted
     to REST at some point.
 
@@ -373,17 +374,17 @@ class Bugzilla(object):
 
         return [a for a
                 in self.proxy.Bug.attachments(params)['bugs'][str(bug_id)]
                 if a['content_type'] == 'text/x-review-board-request']
 
     def _rb_attach_url_matches(self, attach_url, rb_url):
         # Make sure we check for old-style URLs as well.
         return (attach_url == rb_url or
-                '%sdiff/#index_header' % attach_url == rb_url)
+                get_diff_url_from_rr_url(attach_url) == rb_url)
 
     def _get_review_request_attachment(self, bug_id, rb_url):
         """Obtain a Bugzilla attachment for a review request."""
         for a in self.get_rb_attachments(bug_id):
             if self._rb_attach_url_matches(a.get('data'), rb_url):
                 return a
 
         return None
--- a/pylib/mozreview/mozreview/rb_utils.py
+++ b/pylib/mozreview/mozreview/rb_utils.py
@@ -18,8 +18,16 @@ def get_obj_url(obj, site=None, siteconf
 
     if not siteconfig:
         siteconfig = SiteConfiguration.objects.get_current()
 
     return '%s://%s%s%s' % (
         siteconfig.get('site_domain_method'), site.domain,
         local_site_reverse('root').rstrip('/'),
         obj.get_absolute_url())
+
+
+def get_diff_url_from_rr_url(rr_url):
+    return '%sdiff/#index_header' % rr_url
+
+
+def get_diff_url(review_request):
+    return get_diff_url_from_rr_url(get_obj_url(review_request))
--- a/pylib/mozreview/mozreview/signal_handlers.py
+++ b/pylib/mozreview/mozreview/signal_handlers.py
@@ -83,16 +83,17 @@ from mozreview.messages import (
     OBSOLETE_DESCRIPTION,
 )
 from mozreview.models import (
     CommitData,
     DiffSetVerification,
     get_bugzilla_api_key,
 )
 from mozreview.rb_utils import (
+    get_diff_url,
     get_obj_url,
 )
 from mozreview.review_helpers import (
     get_reviewers_status,
 )
 from mozreview.signals import (
     commit_request_publishing,
 )
@@ -540,19 +541,19 @@ def on_review_request_closed_discarded(u
                                      ReviewRequest.DISCARDED,
                                      AUTO_CLOSE_DESCRIPTION,
                                      commit_data=commit_data)
     else:
         # TODO: Remove this once we properly prevent users from closing
         # commit review requests.
         b = Bugzilla(get_bugzilla_api_key(user))
         bug = int(review_request.get_bug_list()[0])
-        diff_url = '%sdiff/#index_header' % get_obj_url(review_request)
         attachment_updates = BugzillaAttachmentUpdates(b, bug)
-        attachment_updates.obsolete_review_attachments(diff_url)
+        attachment_updates.obsolete_review_attachments(
+            get_diff_url(review_request))
         attachment_updates.do_updates()
 
 
 def on_review_request_closed_submitted(user, review_request, type, **kwargs):
     if type != ReviewRequest.SUBMITTED:
         return
 
     commit_data = fetch_commit_data(review_request)
@@ -656,17 +657,17 @@ def on_review_publishing(user, review, *
         # flag was set, in which case throw an error.
         # Ship-its and review flags are allowed only on child commits.
         if review.ship_it or review.extra_data.get(REVIEW_FLAG_KEY):
             raise ParentShipItError
 
         [b.post_comment(int(bug_id), comment) for bug_id in
          review_request.get_bug_list()]
     else:
-        diff_url = '%sdiff/#index_header' % get_obj_url(review_request)
+        diff_url = get_diff_url(review_request)
         bug_id = int(review_request.get_bug_list()[0])
 
         commented = False
         flag = review.extra_data.get(REVIEW_FLAG_KEY)
 
         if flag is not None:
             commented = b.set_review_flag(bug_id, flag, review.user.email,
                                               diff_url, comment)