Пример #1
0
 def dispatch(self, request, *args, **kwargs):
     self.period = Period.objects.get(id=kwargs.pop('period_id'))
     self.assignment = self.request.cradmin_role
     self.devilryrole = self.request.cradmin_instance.get_devilryrole_for_requestuser()
     self.util_class = PassedInPreviousPeriod(self.assignment, self.period, self.request.user)
     if self.assignment.is_fully_anonymous and self.devilryrole != 'departmentadmin':
         raise Http404()
     if self.assignment.is_semi_anonymous and self.devilryrole == 'periodadmin':
         raise Http404()
     return super(ApprovePreviousAssignments, self).dispatch(request, *args, **kwargs)
 def dispatch(self, request, *args, **kwargs):
     self.period = Period.objects.get(id=kwargs.pop('period_id'))
     self.assignment = self.request.cradmin_role
     self.devilryrole = self.request.cradmin_instance.get_devilryrole_for_requestuser()
     self.util_class = PassedInPreviousPeriod(self.assignment, self.period, self.request.user)
     if self.assignment.is_fully_anonymous and self.devilryrole != 'departmentadmin':
         raise Http404()
     if self.assignment.is_semi_anonymous and self.devilryrole == 'periodadmin':
         raise Http404()
     return super(ApprovePreviousAssignments, self).dispatch(request, *args, **kwargs)
    def setUp(self):
        AssignmentGroupDbCacheCustomSql().initialize()
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        self.assignment = mommy.make_recipe(
            'devilry.apps.core.assignment_oldperiod_start',
            short_name='cool',
            long_name='imba',
            parentnode__short_name='s15',
            parentnode__long_name='spring 15',
            passing_grade_min_points=10,
            max_points=15)
        group1 = mommy.make('core.AssignmentGroup',
                            parentnode=self.assignment,
                            name='group1')
        self.previous_feedbackset = group_mommy.feedbackset_new_attempt_published(
            group=group1, grading_points=11)
        candidate1 = core_mommy.candidate(group=group1,
                                          fullname='Mr. Pomeroy',
                                          shortname='mrpomeroy')

        current_assignment = mommy.make_recipe(
            'devilry.apps.core.assignment_activeperiod_start',
            short_name='cool',
            passing_grade_min_points=7,
            max_points=10)
        current_group = mommy.make('core.AssignmentGroup',
                                   parentnode=current_assignment,
                                   name='current_group1')
        mommy.make('core.Candidate',
                   assignment_group=current_group,
                   relatedstudent__user=candidate1.relatedstudent.user)

        self.passed_in_previous = PassedInPreviousPeriod(
            current_assignment, self.assignment.parentnode)
        candidate_queryset = self.passed_in_previous.get_queryset()
        self.assertEqual(1, candidate_queryset.count())
        self.passed_in_previous.set_passed_in_current_period(
            candidate_queryset, testuser)

        self.published_feedbackset = AssignmentGroup.objects.get(id=current_group.id) \
            .cached_data.last_published_feedbackset
        self.feedbackset_passed_previous = FeedbacksetPassedPreviousPeriod.objects.filter(
            feedbackset=self.published_feedbackset).first()
class TestFeedbacksetPassedPreviousPeriod(TestCase):

    def setUp(self):
        AssignmentGroupDbCacheCustomSql().initialize()
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        subject = mommy.make('core.Subject')
        self.assignment = mommy.make_recipe(
            'devilry.apps.core.assignment_oldperiod_start',
            parentnode__parentnode=subject,
            short_name='cool',
            long_name='imba',
            parentnode__short_name='s15',
            parentnode__long_name='spring 15',
            passing_grade_min_points=10,
            max_points=15
        )
        group1 = mommy.make('core.AssignmentGroup', parentnode=self.assignment, name='group1')
        self.previous_feedbackset = group_mommy.feedbackset_new_attempt_published(group=group1, grading_points=11)
        candidate1 = core_mommy.candidate(group=group1, fullname='Mr. Pomeroy', shortname='mrpomeroy')

        current_assignment = mommy.make_recipe(
            'devilry.apps.core.assignment_activeperiod_start',
            parentnode__parentnode=subject,
            short_name='cool',
            passing_grade_min_points=7,
            max_points=10
        )
        current_group = mommy.make('core.AssignmentGroup', parentnode=current_assignment, name='current_group1')
        mommy.make('core.Candidate', assignment_group=current_group,
                   relatedstudent__user=candidate1.relatedstudent.user)

        self.passed_in_previous = PassedInPreviousPeriod(current_assignment, self.assignment.parentnode)
        candidate_queryset = self.passed_in_previous.get_queryset()
        self.assertEqual(1, candidate_queryset.count())
        self.passed_in_previous.set_passed_in_current_period(candidate_queryset, testuser)

        self.published_feedbackset = AssignmentGroup.objects.get(id=current_group.id) \
            .cached_data.last_published_feedbackset
        self.feedbackset_passed_previous = FeedbacksetPassedPreviousPeriod.objects.filter(
            feedbackset=self.published_feedbackset).first()

    def test_feedbackset_foreign_key_is_correct(self):
        self.assertIsNotNone(self.feedbackset_passed_previous)
        self.assertEqual(self.feedbackset_passed_previous.feedbackset.id, self.published_feedbackset.id)

    def test_assignment_data_is_correct(self):
        self.assertEqual(self.feedbackset_passed_previous.assignment_short_name, self.assignment.short_name)
        self.assertEqual(self.feedbackset_passed_previous.assignment_long_name, self.assignment.long_name)
        self.assertEqual(self.feedbackset_passed_previous.assignment_max_points, self.assignment.max_points)
        self.assertEqual(self.feedbackset_passed_previous.assignment_passing_grade_min_points,
                         self.assignment.passing_grade_min_points)

    def test_period_data_is_correct(self):
        self.assertEqual(self.feedbackset_passed_previous.period_short_name, self.assignment.parentnode.short_name)
        self.assertEqual(self.feedbackset_passed_previous.period_long_name, self.assignment.parentnode.long_name)
        self.assertEqual(self.feedbackset_passed_previous.period_start_time, self.assignment.parentnode.start_time)
        self.assertEqual(self.feedbackset_passed_previous.period_end_time, self.assignment.parentnode.end_time)

    def test_old_grading_data_is_correct(self):
        self.assertEqual(self.feedbackset_passed_previous.grading_points, self.previous_feedbackset.grading_points)
        self.assertEqual(self.feedbackset_passed_previous.grading_published_by,
                         self.previous_feedbackset.grading_published_by)
        self.assertEqual(self.feedbackset_passed_previous.grading_published_datetime,
                         self.previous_feedbackset.grading_published_datetime)

    def test_feedbackset_passed_previous_period_cascades_on_feedbackset_delete(self):
        self.published_feedbackset.delete()
        self.assertFalse(
            FeedbacksetPassedPreviousPeriod.objects.filter(id=self.feedbackset_passed_previous.id).exists()
        )
Пример #5
0
class ApprovePreviousAssignments(formbase.FormView):
    form_class = ApprovePreviousForm
    template_name = 'devilry_admin/assignment/passed_previous_period/confirm-view.django.html'

    def dispatch(self, request, *args, **kwargs):
        self.period = Period.objects.get(id=kwargs.pop('period_id'))
        self.assignment = self.request.cradmin_role
        self.devilryrole = self.request.cradmin_instance.get_devilryrole_for_requestuser()
        self.util_class = PassedInPreviousPeriod(self.assignment, self.period, self.request.user)
        if self.assignment.is_fully_anonymous and self.devilryrole != 'departmentadmin':
            raise Http404()
        if self.assignment.is_semi_anonymous and self.devilryrole == 'periodadmin':
            raise Http404()
        return super(ApprovePreviousAssignments, self).dispatch(request, *args, **kwargs)

    def get_pagetitle(self):
        return ugettext_lazy('Approve assignments')

    def __get_candidate_listbuilder(self):
        listbuilder = CandidateListbuilder(self.assignment, self.devilryrole, self.util_class)
        listbuilder.build()
        return listbuilder

    def __get_candidate_ids(self):
        return [candidate.id for candidate in self.util_class.get_queryset()]

    def get_context_data(self, **kwargs):
        context = super(ApprovePreviousAssignments, self).get_context_data(**kwargs)
        context['period_id'] = self.period.id
        context['candidate_list'] = self.__get_candidate_listbuilder()
        return context

    def get_buttons(self):
        return [
            PrimarySubmit('Confirm', ugettext_lazy('Confirm'))
        ]

    def get_field_layout(self):
        return [
            layout.Hidden('candidates', self.__get_candidate_ids())
        ]

    def __get_candidates_displayname(self, candidates):
        candidate_short_name = ""
        for candidate in candidates:
            candidate_short_name += '{}, '.format(candidate.relatedstudent.user.get_displayname())
        return candidate_short_name[:-2]

    def form_valid(self, form):
        try:
            candidates = Candidate.objects.filter(id__in=json.loads(form.data['candidates']))\
                .select_related('relatedstudent__user')
            self.util_class.set_passed_in_current_period(
                candidates,
                self.request.user
            )
        except SomeCandidatesDoesNotQualifyToPass as e:
            messages.warning(
                self.request,
                ugettext_lazy('Some students does not qualify to pass the assignment.')
            )
        except NoCandidatesPassed:
            messages.warning(
                self.request,
                ugettext_lazy('No students are qualified to get approved '
                              'for this assignment from a previous assignment.')
            )
        except:
            messages.warning(
                self.request,
                ugettext_lazy('An error occurred.')
            )
        else:
            messages.success(
                self.request,
                ugettext_lazy(
                    '%(students)s was marked as approved for this assignment.') % {
                    'students': self.__get_candidates_displayname(candidates)
                }
            )
        return redirect(self.get_success_url())

    def get_success_url(self):
        return self.request.cradmin_instance.reverse_url(appname="overview", viewname=crapp.INDEXVIEW_NAME)
class ApprovePreviousAssignments(formbase.FormView):
    form_class = ApprovePreviousForm
    template_name = 'devilry_admin/assignment/passed_previous_period/confirm-view.django.html'

    def dispatch(self, request, *args, **kwargs):
        self.period = Period.objects.get(id=kwargs.pop('period_id'))
        self.assignment = self.request.cradmin_role
        self.devilryrole = self.request.cradmin_instance.get_devilryrole_for_requestuser()
        self.util_class = PassedInPreviousPeriod(self.assignment, self.period, self.request.user)
        if self.assignment.is_fully_anonymous and self.devilryrole != 'departmentadmin':
            raise Http404()
        if self.assignment.is_semi_anonymous and self.devilryrole == 'periodadmin':
            raise Http404()
        return super(ApprovePreviousAssignments, self).dispatch(request, *args, **kwargs)

    def get_pagetitle(self):
        return ugettext_lazy('Approve assignments')

    def __get_candidate_listbuilder(self):
        listbuilder = CandidateListbuilder(self.assignment, self.devilryrole, self.util_class)
        listbuilder.build()
        return listbuilder

    def __get_candidate_ids(self):
        return [candidate.id for candidate in self.util_class.get_queryset()]

    def get_context_data(self, **kwargs):
        context = super(ApprovePreviousAssignments, self).get_context_data(**kwargs)
        context['period_id'] = self.period.id
        context['candidate_list'] = self.__get_candidate_listbuilder()
        return context

    def get_buttons(self):
        return [
            PrimarySubmit('Confirm', ugettext_lazy('Confirm'))
        ]

    def get_field_layout(self):
        return [
            layout.Hidden('candidates', self.__get_candidate_ids())
        ]

    def __get_candidates_displayname(self, candidates):
        candidate_short_name = ""
        for candidate in candidates:
            candidate_short_name += '{}, '.format(candidate.relatedstudent.user.get_displayname())
        return candidate_short_name[:-2]

    def form_valid(self, form):
        try:
            candidates = Candidate.objects.filter(id__in=json.loads(form.data['candidates']))\
                .select_related('relatedstudent__user')
            self.util_class.set_passed_in_current_period(
                candidates,
                self.request.user
            )
        except SomeCandidatesDoesNotQualifyToPass as e:
            messages.warning(
                self.request,
                ugettext_lazy('Some students does not qualify to pass the assignment.')
            )
        except NoCandidatesPassed:
            messages.warning(
                self.request,
                ugettext_lazy('No students are qualified to get approved '
                              'for this assignment from a previous assignment.')
            )
        except:
            messages.warning(
                self.request,
                ugettext_lazy('An error occurred.')
            )
        else:
            messages.success(
                self.request,
                ugettext_lazy(
                    '%(students)s was marked as approved for this assignment.') % {
                    'students': self.__get_candidates_displayname(candidates)
                }
            )
        return redirect(self.get_success_url())

    def get_success_url(self):
        return self.request.cradmin_instance.reverse_url(appname="overview", viewname=crapp.INDEXVIEW_NAME)