mozreview: create migrations file for reviewer flag in db (bug 1274371) r=glob draft
authorPiotr Zalewa <pzalewa@mozilla.com>
Thu, 02 Feb 2017 12:43:07 +0100
changeset 10458 de9d5671dacefacd24b2cb200c741e351f39d26e
parent 10457 75284e964037eab1b6a7145f390558623e785706
push id1550
push userbmo:pzalewa@mozilla.com
push dateMon, 06 Mar 2017 20:29:47 +0000
reviewersglob
bugs1274371
mozreview: create migrations file for reviewer flag in db (bug 1274371) r=glob Create MozReviewFlag entries for all existing reviewers. MozReview-Commit-ID: KF1bkshoqYR
pylib/mozreview/mozreview/migrations/create_reviewers_flags.py
new file mode 100644
--- /dev/null
+++ b/pylib/mozreview/mozreview/migrations/create_reviewers_flags.py
@@ -0,0 +1,114 @@
+"""This is a 1-off migration to be run as part of the fix for
+https://bugzilla.mozilla.org/show_bug.cgi?id=1274371.
+We need to create MozReviewFlag entries for reviewers.
+"""
+
+import os
+import sys
+
+from reviewboard.reviews.models import (
+    ReviewRequest,
+)
+from mozreview.extra_data import (
+    REVIEW_FLAG_KEY,
+    is_parent,
+)
+from mozreview.models import (
+    MozReviewFlag,
+    MozReviewFlagType,
+)
+
+
+DRY_RUN = int(os.environ.get('DRY_RUN', '1'))
+VERBOSE = int(os.environ.get('VERBOSE', '1'))
+SILENT = int(os.environ.get('SILENT', '0'))
+
+if SILENT:
+    VERBOSE = 0
+
+def main():
+    flag_type = MozReviewFlagType.objects.get_review_type()
+    flags_number = 0
+
+    if VERBOSE >= 1:
+        print 'Loading %d ReviewRequests' % ReviewRequest.objects.count()
+
+    for review_request in ReviewRequest.objects.all():
+        if is_parent(review_request):
+            continue
+
+        target_people = review_request.target_people.all()
+        reviewers = {}
+
+        # prepare r? flag for each reviewer mentioned in target_people
+        for reviewer in target_people:
+            reviewers[reviewer.username] = {
+                'type': flag_type,
+                'value': '?',
+                'review_request': review_request,
+                'setter': review_request.submitter,
+                'requestee': reviewer,
+                'timestamp': review_request.time_added,
+            }
+
+        for review in review_request.reviews.order_by('-timestamp'):
+            # find latest reviews per reviewer
+            if (review.user.username not in reviewers
+                    or not reviewers[review.user.username].get('review',
+                                                               False)):
+                # There is no way to find out if reviewer was in target_people
+                # at the moment of creating a review. Let's assume that all
+                # such cases are impromptu reviews.
+                impromptu = review.user.username not in reviewers
+                # do not play with flag ' '
+                flag_status = review.extra_data.get(REVIEW_FLAG_KEY, None)
+                if not flag_status or flag_status == ' ':
+                    break
+                flag_value = flag_type.get_value_from_status(flag_status)
+                # Do not create a '?' flag for an impromptu review
+                if not (impromptu and flag_value == '?'):
+                    reviewers[review.user.username] = {
+                        'type': flag_type,
+                        'value': flag_value,
+                        'review_request': review_request,
+                        'review': review,
+                        'setter': review.user,
+                        'requestee': review.user,
+                        'timestamp': review.timestamp,
+                    }
+        if len(reviewers) > 0:
+            if VERBOSE >= 2:
+                print("    Creating %d flags in %s\n" % (
+                    len(reviewers), review_request))
+
+            for k in reviewers:
+                args = reviewers[k]
+
+                if VERBOSE == 1:
+                    sys.stdout.write('.')
+                    sys.stdout.flush()
+                elif VERBOSE >= 3:
+                    print(args)
+
+                try:
+                    MozReviewFlag.objects.get(
+                        review_request=args['review_request'],
+                        requestee=args['requestee'],
+                        setter=args['setter'])
+                except MozReviewFlag.DoesNotExist:
+                    if not DRY_RUN:
+                        MozReviewFlag.objects.get_or_create(**args)
+
+        else:
+            if VERBOSE >= 3:
+                print("### Not creating any flags in %s\n" % review_request)
+
+        flags_number += len(reviewers)
+
+    if VERBOSE >= 1:
+        print "%d flags processed" % flags_number
+        print "%d flags in database" % MozReviewFlag.objects.count()
+
+
+if __name__ == "__main__":
+   main()