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() )
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)