def gen_perm(tup): new_perm = Permission(permission_type=tup[0], program=prog) if tup[2]: new_perm.start_date = tup[2] if tup[3]: new_perm.end_date = tup[3] if tup[1] is not None: new_perm.user = tup[1] new_perm.save() return elif tup[1] is None and tup[0].startswith("Student"): new_perm.role = Group.objects.get(name="Student") new_perm.save() return elif tup[1] is None and tup[0].startswith("Teacher"): new_perm.role = Group.objects.get(name="Teacher") new_perm.save() return #It's not for a specific user and not a teacher or student deadline for x in ESPUser.getTypes(): newnew_perm = Permission(permission_type=new_perm.permission_type, role=Group.objects.get(name=x), start_date=new_perm.start_date, end_date=new_perm.end_date, program=prog) newnew_perm.save()
def lottery(self, prog, role): # Run lottery algorithm. # Get grade caps grade_caps_str = prog.grade_caps() grade_caps = { int(key[0]): value for key, value in grade_caps_str.iteritems() } #Get lottery records and randomize them records = PhaseZeroRecord.objects.filter(program=prog).order_by('?') ############################################################################### # The lottery algorithm is run, with randomization and processing in order. # If any one in the group doesn't get in (due to cap size), no one in that group gets in. counts = {key: 0 for key in grade_caps} winners, _ = Group.objects.get_or_create(name=role) for i in records: sibs = i.user.all() newcounts = copy.copy(counts) for j in sibs: newcounts[j.getGrade(prog)] += 1 cpass = not any(newcounts[c] > grade_caps[c] for c in counts) if cpass: winners.user_set.add(*sibs) counts = newcounts ############################################################################### # Post lottery, assign permissions to people in the lottery winners group # Assign OverridePhaseZero permission and Student/All permissions override_perm = Permission(permission_type='OverridePhaseZero', role=winners, start_date=datetime.datetime.now(), program=prog) studentAll_perm = Permission(permission_type='Student/All', role=winners, start_date=datetime.datetime.now(), program=prog) override_perm.save() studentAll_perm.save() # Add tag to indicate student lottery has been run Tag.setTag('student_lottery_run', target=prog, value='True') return True
def forwards(self, orm): def end(bit): date = bit.enddate if date > datetime.datetime(3000, 1, 1): return None return date #Administer adm_bits = UserBit.objects.filter(verb__uri="V/Administer", qsc__uri__startswith="Q/Programs") for bit in adm_bits: try: p = Program.objects.get(anchor=bit.qsc) except Program.DoesNotExist: continue Permission(permission_type="Administer", program=p, user=bit.user, startdate=bit.startdate, enddate=end(bit)).save() # Administer all programs, but with an enddate. # Adds users that we didn't add to the Administrator group in 0019_userrole. for bit in UserBit.objects.filter(verb__uri="V/Administer", qsc__uri="Q", user__isnull=False, enddate__lt=datetime.datetime( 3000, 1, 1)): Permission(permission_type="Administer", program=None, user=bit.user, startdate=bit.startdate, enddate=end(bit)).save() #view programs program_anchors = Program.objects.all().values_list("anchor", flat=True) view_program_bits = UserBit.objects.filter(verb__uri="V/Flags/Public", qsc__id__in=program_anchors) for bit in view_program_bits: try: p = Program.objects.get(anchor=bit.qsc) except Program.DoesNotExist: continue if bit.user is not None: Permission(permission_type=bit.verb.uri[24:], user=bit.user, program=p, startdate=bit.startdate, enddate=end(bit)).save() else: for x in ESPUser.getTypes(): Permission(permission_type=bit.verb.uri[24:], role=Group.objects.get(name=x), program=p, startdate=bit.startdate, enddate=end(bit)).save() #gradeoverride go_bits = UserBit.objects.filter( verb__uri="V/Flags/Registration/GradeOverride", qsc__uri__startswith="Q/Programs") for bit in go_bits: try: p = Program.objects.get(anchor=bit.qsc) except Program.DoesNotExist: continue Permission(permission_type="GradeOverride", program=p, user=bit.user, startdate=bit.startdate, enddate=end(bit)).save() #onsite onsite_bits = UserBit.objects.filter(verb__uri="V/Registration/Onsite") for bit in onsite_bits: try: p = Program.objects.get(anchor=bit.qsc) except Program.DoesNotExist: continue Permission(permission_type="Onsite", user=bit.user, program=p, startdate=bit.startdate, enddate=end(bit)).save() #deadlines deadline_bits = UserBit.objects.filter( verb__uri__startswith="V/Deadline/Registration") for bit in deadline_bits: try: p = Program.objects.get(anchor=bit.qsc) except Program.DoesNotExist: continue name = bit.verb.uri[24:] if bit.recursive and bit.verb.name in [ "Classes", "Teacher", "Student" ]: name += "/All" if bit.user is not None: Permission(permission_type=name, user=bit.user, program=p, startdate=bit.startdate, enddate=end(bit)).save() elif bit.verb.uri[24:31] == "Teacher": Permission(permission_type=name, role=Group.objects.get(name="Teacher"), program=p, startdate=bit.startdate, enddate=end(bit)).save() elif bit.verb.uri[24:31] == "Student": Permission(permission_type=name, role=Group.objects.get(name="Student"), program=p, startdate=bit.startdate, enddate=end(bit)).save()