def addReviewFilters(db, creator, user, review, reviewer_directory_ids, reviewer_file_ids, watcher_directory_ids, watcher_file_ids): cursor = db.cursor() cursor.execute("INSERT INTO reviewassignmentstransactions (review, assigner) VALUES (%s, %s) RETURNING id", (review.id, creator.id)) transaction_id = cursor.fetchone()[0] def add(filter_type, directory_ids, file_ids): for directory_id, file_id in izip(directory_ids, file_ids): cursor.execute("""SELECT id, type FROM reviewfilters WHERE review=%s AND uid=%s AND directory=%s AND file=%s""", (review.id, user.id, directory_id, file_id)) row = cursor.fetchone() if row: old_filter_id, old_filter_type = row if old_filter_type == filter_type: continue else: cursor.execute("""DELETE FROM reviewfilters WHERE id=%s""", (old_filter_id,)) cursor.execute("""INSERT INTO reviewfilterchanges (transaction, uid, directory, file, type, created) VALUES (%s, %s, %s, %s, %s, false)""", (transaction_id, user.id, directory_id, file_id, old_filter_type)) cursor.execute("""INSERT INTO reviewfilters (review, uid, directory, file, type, creator) VALUES (%s, %s, %s, %s, %s, %s)""", (review.id, user.id, directory_id, file_id, filter_type, creator.id)) cursor.execute("""INSERT INTO reviewfilterchanges (transaction, uid, directory, file, type, created) VALUES (%s, %s, %s, %s, %s, true)""", (transaction_id, user.id, directory_id, file_id, filter_type)) add("reviewer", reviewer_directory_ids, repeat(0)) add("reviewer", repeat(0), reviewer_file_ids) add("watcher", watcher_directory_ids, repeat(0)) add("watcher", repeat(0), watcher_file_ids) filters = Filters() filters.load(db, review=review, user=user) if user not in review.reviewers and user not in review.watchers and user not in review.owners: cursor.execute("""INSERT INTO reviewusers (review, uid, type) VALUES (%s, %s, 'manual')""", (review.id, user.id,)) delete_files = set() insert_files = set() if watcher_directory_ids or watcher_file_ids: # Unassign changes currently assigned to the affected user. cursor.execute("""SELECT reviewfiles.id, reviewfiles.file FROM reviewfiles JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id) WHERE reviewfiles.review=%s AND reviewuserfiles.uid=%s""", (review.id, user.id)) for review_file_id, file_id in cursor: if not filters.isReviewer(db, user.id, file_id): delete_files.add(review_file_id) if reviewer_directory_ids or reviewer_file_ids: # Assign changes currently not assigned to the affected user. cursor.execute("""SELECT reviewfiles.id, reviewfiles.file FROM reviewfiles JOIN changesets ON (changesets.id=reviewfiles.changeset) JOIN commits ON (commits.id=changesets.child) JOIN gitusers ON (gitusers.id=commits.author_gituser) LEFT OUTER JOIN usergitemails USING (email) LEFT OUTER JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id AND reviewuserfiles.uid=%s) WHERE reviewfiles.review=%s AND (usergitemails.uid IS NULL OR usergitemails.uid!=%s) AND reviewuserfiles.uid IS NULL""", (user.id, review.id, user.id)) for review_file_id, file_id in cursor: if filters.isReviewer(db, user.id, file_id): insert_files.add(review_file_id) if delete_files: cursor.executemany("DELETE FROM reviewuserfiles WHERE file=%s AND uid=%s", izip(delete_files, repeat(user.id))) cursor.executemany("INSERT INTO reviewassignmentchanges (transaction, file, uid, assigned) VALUES (%s, %s, %s, false)", izip(repeat(transaction_id), delete_files, repeat(user.id))) if insert_files: cursor.executemany("INSERT INTO reviewuserfiles (file, uid) VALUES (%s, %s)", izip(insert_files, repeat(user.id))) cursor.executemany("INSERT INTO reviewassignmentchanges (transaction, file, uid, assigned) VALUES (%s, %s, %s, true)", izip(repeat(transaction_id), insert_files, repeat(user.id))) return generateMailsForAssignmentsTransaction(db, transaction_id)
def addReviewFilters(db, creator, user, review, reviewer_directory_ids, reviewer_file_ids, watcher_directory_ids, watcher_file_ids): cursor = db.cursor() cursor.execute( "INSERT INTO reviewassignmentstransactions (review, assigner) VALUES (%s, %s) RETURNING id", (review.id, creator.id)) transaction_id = cursor.fetchone()[0] def add(filter_type, directory_ids, file_ids): for directory_id, file_id in izip(directory_ids, file_ids): cursor.execute( """SELECT id, type FROM reviewfilters WHERE review=%s AND uid=%s AND directory=%s AND file=%s""", (review.id, user.id, directory_id, file_id)) row = cursor.fetchone() if row: old_filter_id, old_filter_type = row if old_filter_type == filter_type: continue else: cursor.execute( """DELETE FROM reviewfilters WHERE id=%s""", (old_filter_id, )) cursor.execute( """INSERT INTO reviewfilterchanges (transaction, uid, directory, file, type, created) VALUES (%s, %s, %s, %s, %s, false)""", (transaction_id, user.id, directory_id, file_id, old_filter_type)) cursor.execute( """INSERT INTO reviewfilters (review, uid, directory, file, type, creator) VALUES (%s, %s, %s, %s, %s, %s)""", (review.id, user.id, directory_id, file_id, filter_type, creator.id)) cursor.execute( """INSERT INTO reviewfilterchanges (transaction, uid, directory, file, type, created) VALUES (%s, %s, %s, %s, %s, true)""", (transaction_id, user.id, directory_id, file_id, filter_type)) add("reviewer", reviewer_directory_ids, repeat(0)) add("reviewer", repeat(0), reviewer_file_ids) add("watcher", watcher_directory_ids, repeat(0)) add("watcher", repeat(0), watcher_file_ids) filters = Filters() filters.load(db, review=review, user=user) if user not in review.reviewers and user not in review.watchers and user not in review.owners: cursor.execute( """INSERT INTO reviewusers (review, uid, type) VALUES (%s, %s, 'manual')""", ( review.id, user.id, )) delete_files = set() insert_files = set() if watcher_directory_ids or watcher_file_ids: # Unassign changes currently assigned to the affected user. cursor.execute( """SELECT reviewfiles.id, reviewfiles.file FROM reviewfiles JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id) WHERE reviewfiles.review=%s AND reviewuserfiles.uid=%s""", (review.id, user.id)) for review_file_id, file_id in cursor: if not filters.isReviewer(db, user.id, file_id): delete_files.add(review_file_id) if reviewer_directory_ids or reviewer_file_ids: # Assign changes currently not assigned to the affected user. cursor.execute( """SELECT reviewfiles.id, reviewfiles.file FROM reviewfiles JOIN changesets ON (changesets.id=reviewfiles.changeset) JOIN commits ON (commits.id=changesets.child) JOIN gitusers ON (gitusers.id=commits.author_gituser) LEFT OUTER JOIN usergitemails USING (email) LEFT OUTER JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id AND reviewuserfiles.uid=%s) WHERE reviewfiles.review=%s AND (usergitemails.uid IS NULL OR usergitemails.uid!=%s) AND reviewuserfiles.uid IS NULL""", (user.id, review.id, user.id)) for review_file_id, file_id in cursor: if filters.isReviewer(db, user.id, file_id): insert_files.add(review_file_id) if delete_files: cursor.executemany( "DELETE FROM reviewuserfiles WHERE file=%s AND uid=%s", izip(delete_files, repeat(user.id))) cursor.executemany( "INSERT INTO reviewassignmentchanges (transaction, file, uid, assigned) VALUES (%s, %s, %s, false)", izip(repeat(transaction_id), delete_files, repeat(user.id))) if insert_files: cursor.executemany( "INSERT INTO reviewuserfiles (file, uid) VALUES (%s, %s)", izip(insert_files, repeat(user.id))) cursor.executemany( "INSERT INTO reviewassignmentchanges (transaction, file, uid, assigned) VALUES (%s, %s, %s, true)", izip(repeat(transaction_id), insert_files, repeat(user.id))) return generateMailsForAssignmentsTransaction(db, transaction_id)