Adds a manage.py script to assign reviewers to talks.

Requires that a 'reviewers' group exist, and that there are people assigned to it (otherwise it won't find any reviewers to add!).

It will assign up to 3 reviewers, where those reviewers are NOT one of the speakers, and that reviewer has not opted out of reviewing that talk. It will choose random reviewers from those with the fewest existing not-opted-out assignments.
This commit is contained in:
Taavi Burns 2013-06-21 22:50:16 -04:00
parent 6c1cfd1a53
commit e180c7f00b
2 changed files with 27 additions and 3 deletions

View file

@ -0,0 +1,17 @@
import csv
import os
import random
from django.contrib.auth import models
from django.core.management.base import BaseCommand
from symposion.reviews.models import ReviewAssignment
from symposion.proposals.models import ProposalBase
class Command(BaseCommand):
def handle(self, *args, **options):
for proposal in ProposalBase.objects.filter(cancelled=0):
print "Creating assignments for %s" % (proposal.title,)
ReviewAssignment.create_assignments(proposal)

View file

@ -44,6 +44,8 @@ class ReviewAssignment(models.Model):
OPT_IN = 1 OPT_IN = 1
AUTO_ASSIGNED_LATER = 2 AUTO_ASSIGNED_LATER = 2
NUM_REVIEWERS = 3
ORIGIN_CHOICES = [ ORIGIN_CHOICES = [
(AUTO_ASSIGNED_INITIAL, "auto-assigned, initial"), (AUTO_ASSIGNED_INITIAL, "auto-assigned, initial"),
(OPT_IN, "opted-in"), (OPT_IN, "opted-in"),
@ -66,7 +68,10 @@ class ReviewAssignment(models.Model):
speaker.user_id speaker.user_id
for speaker in speakers for speaker in speakers
if speaker.user_id is not None if speaker.user_id is not None
] ] + [
assignment.user_id
for assignment in ReviewAssignment.objects.filter(
proposal_id=proposal.id)]
).filter( ).filter(
groups__name="reviewers", groups__name="reviewers",
).filter( ).filter(
@ -74,9 +79,11 @@ class ReviewAssignment(models.Model):
).annotate( ).annotate(
num_assignments=models.Count("reviewassignment") num_assignments=models.Count("reviewassignment")
).order_by( ).order_by(
"num_assignments", "num_assignments", "?",
) )
for reviewer in reviewers[:3]: num_assigned_reviewers = ReviewAssignment.objects.filter(
proposal_id=proposal.id, opted_out=0).count()
for reviewer in reviewers[:max(0, cls.NUM_REVIEWERS - num_assigned_reviewers)]:
cls._default_manager.create( cls._default_manager.create(
proposal=proposal, proposal=proposal,
user=reviewer, user=reviewer,