mozreview: create migrations file for reviewer flag in db (
bug 1274371) r=glob
Create MozReviewFlag entries for all existing reviewers.
MozReview-Commit-ID: KF1bkshoqYR
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()