Ejemplo n.º 1
0
    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
Ejemplo n.º 3
0
    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()