def test_setupstudents_copyfromassignment_onlypassing(self):
        dao = CreateNewAssignmentDao()
        self.testhelper.add_to_path('uni;sub.p1.a1.awesome:candidate(student1):examiner(examiner1).d1')
        self.testhelper.add_to_path('uni;sub.p1.a1.failer:candidate(student2):examiner(examiner2).d1')
        self.testhelper.add_to_path('uni;sub.p1.a1.nofeedback:candidate(student3)')
        self.testhelper.add_delivery(self.testhelper.sub_p1_a1_awesome,
                                     {'f.py': ['print ', 'yeh']})
        self.testhelper.add_feedback(self.testhelper.sub_p1_a1_awesome,
                                     verdict={'grade': 'A', 'points': 100, 'is_passing_grade': True})
        self.testhelper.add_delivery(self.testhelper.sub_p1_a1_failer,
                                     {'f.py': ['print ', 'meh']})
        self.testhelper.add_feedback(self.testhelper.sub_p1_a1_failer,
                                     verdict={'grade': 'F', 'points': 1, 'is_passing_grade': False})

        self.testhelper.add_to_path('uni;sub.p1.a2')
        deadline = self.testhelper.sub_p1_a1.publishing_time + timedelta(days=1)
        self.assertEquals(self.testhelper.sub_p1_a1.assignmentgroups.count(), 3)
        self.assertEquals(self.testhelper.sub_p1_a2.assignmentgroups.count(), 0)

        dao._setup_students(self.testhelper.sub_p1_a2,
                            first_deadline=deadline,
                            copyfromassignment_id=self.testhelper.sub_p1_a1.id,
                            only_copy_passing_groups=True,
                            setupstudents_mode='copyfromassignment',
                            setupexaminers_mode='do_not_setup')
        self.assertEquals(self.testhelper.sub_p1_a2.assignmentgroups.count(), 1)

        group = self.testhelper.sub_p1_a2.assignmentgroups.all()[0]
        self.assertEquals(group.name, 'awesome')
    def test_setupstudents_copyfromassignment(self):
        dao = CreateNewAssignmentDao()
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1;secret):tags(good,super)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g2:candidate(student2,student3)')
        self.testhelper.add_to_path('uni;sub.p1.a2')
        deadline = self.testhelper.sub_p1_a1.publishing_time + timedelta(days=1)

        self.assertEquals(self.testhelper.sub_p1_a1.assignmentgroups.count(), 2)
        self.assertEquals(self.testhelper.sub_p1_a2.assignmentgroups.count(), 0)
        dao._setup_students(self.testhelper.sub_p1_a2,
                            first_deadline=deadline,
                            copyfromassignment_id=self.testhelper.sub_p1_a1.id,
                            setupstudents_mode='copyfromassignment',
                            setupexaminers_mode='do_not_setup')
        self.assertEquals(self.testhelper.sub_p1_a2.assignmentgroups.count(), 2)

        groups = list(self.testhelper.sub_p1_a2.assignmentgroups.all().order_by('candidates__student__username'))
        self.assertEquals(groups[0].name, 'g1')
        self.assertEquals(groups[0].candidates.all()[0].student.username, 'student1')
        self.assertEquals(groups[0].candidates.all()[0].candidate_id, 'secret')
        self.assertEquals(set([t.tag for t in groups[0].tags.all()]),
                          set(['good', 'super']))
        self.assertEquals(groups[1].name, 'g2')
        self.assertEquals(set([c.student.username for c in groups[1].candidates.all()]),
                          set(['student2', 'student3']))
        self.assertEquals(groups[1].tags.count(), 0)

        self.assertEquals(groups[0].deadlines.all().count(), 1)
        self.assertEquals(groups[1].deadlines.all().count(), 1)
        self.assertEquals(groups[0].deadlines.all()[0].deadline, deadline)
    def test_setupstudents_copyfromassignment_outofperiod(self):
        dao = CreateNewAssignmentDao()
        self.testhelper.add_to_path('uni;sub.p1.a1')
        self.testhelper.add_to_path('uni;sub.p2.a1')
        deadline = self.testhelper.sub_p1_a1.publishing_time + timedelta(days=1)

        with self.assertRaises(BadRequestFieldError):
            dao._setup_students(self.testhelper.sub_p1_a1,
                                first_deadline=deadline,
                                copyfromassignment_id=self.testhelper.sub_p2_a1.id,
                                setupstudents_mode='copyfromassignment',
                                setupexaminers_mode='copyfromassignment')
    def test_setupstudents_allrelated_examiners_bytags(self):
        self._create_related_student('louie', tags='bb,aa')
        self._create_related_examiner('examiner2', tags='aa,cc')
        dao = CreateNewAssignmentDao()
        self.testhelper.add_to_path('uni;sub.p1.a1')

        deadline = self.testhelper.sub_p1_a1.publishing_time + timedelta(days=1)
        dao._setup_students(self.testhelper.sub_p1_a1,
                            first_deadline=deadline,
                            setupstudents_mode='allrelated',
                            setupexaminers_mode='bytags')
        group = self.testhelper.sub_p1_a1.assignmentgroups.all()[0]
        self.assertEquals(group.examiners.all().count(), 1)
    def test_setupstudents_copyfromassignment_withexaminers(self):
        dao = CreateNewAssignmentDao()
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1,examiner2)')
        self.testhelper.add_to_path('uni;sub.p1.a2')
        deadline = self.testhelper.sub_p1_a1.publishing_time + timedelta(days=1)

        dao._setup_students(self.testhelper.sub_p1_a2,
                            first_deadline=deadline,
                            copyfromassignment_id=self.testhelper.sub_p1_a1.id,
                            setupstudents_mode='copyfromassignment',
                            setupexaminers_mode='copyfromassignment')
        self.assertEquals(self.testhelper.sub_p1_a2.assignmentgroups.count(), 1)

        group = self.testhelper.sub_p1_a2.assignmentgroups.all()[0]
        self.assertEquals(set([c.user.username for c in group.examiners.all()]),
                          set(['examiner1', 'examiner2']))
    def test_setupstudents_copyfromassignment_make_authuser_examiner(self):
        dao = CreateNewAssignmentDao()
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a2')
        deadline = self.testhelper.sub_p1_a1.publishing_time + timedelta(days=1)

        user = self.testhelper.create_user('superhero')
        dao._setup_students(self.testhelper.sub_p1_a2,
                            first_deadline=deadline,
                            copyfromassignment_id=self.testhelper.sub_p1_a1.id,
                            setupstudents_mode='copyfromassignment',
                            setupexaminers_mode='make_authenticated_user_examiner',
                            user=user)
        self.assertEquals(self.testhelper.sub_p1_a2.assignmentgroups.count(), 1)

        group = self.testhelper.sub_p1_a2.assignmentgroups.all()[0]
        self.assertEquals(set([c.user.username for c in group.examiners.all()]),
                          set(['superhero']))
    def test_setupstudents_allrelated(self):
        self._create_related_student('louie')
        self._create_related_student('dewey', candidate_id='dew123')
        dao = CreateNewAssignmentDao()
        self.testhelper.add_to_path('uni;sub.p1.a1')

        self.assertEquals(self.testhelper.sub_p1_a1.assignmentgroups.count(), 0)
        deadline = self.testhelper.sub_p1_a1.publishing_time + timedelta(days=1)
        dao._setup_students(self.testhelper.sub_p1_a1,
                            first_deadline=deadline,
                            setupstudents_mode='allrelated',
                            setupexaminers_mode='do_not_setup')
        self.assertEquals(self.testhelper.sub_p1_a1.assignmentgroups.count(), 2)

        groups = list(self.testhelper.sub_p1_a1.assignmentgroups.all().order_by('candidates__student__username'))
        self.assertEquals(groups[0].candidates.all()[0].student.username, 'dewey')
        self.assertEquals(groups[0].candidates.all()[0].candidate_id, 'dew123')
        self.assertEquals(groups[1].candidates.all()[0].student.username, 'louie')
        self.assertEquals(groups[1].candidates.all()[0].candidate_id, None)

        self.assertEquals(groups[0].deadlines.all().count(), 1)
        self.assertEquals(groups[1].deadlines.all().count(), 1)
        self.assertEquals(groups[0].deadlines.all()[0].deadline, deadline)