def post(self, request, id=None): period = self.CONTENT['period'] self._permissioncheck(period) with transaction.commit_on_success(): status = Status( period = period, status = self.CONTENT['status'], message = self.CONTENT['message'], user = self.request.user, plugin = self.CONTENT['plugin'] ) status.full_clean() status.save() if status.status != 'notready': passing_relatedstudentids = set(self.CONTENT['passing_relatedstudentids']) notready_relatedstudentids = set(self.CONTENT['notready_relatedstudentids']) for relatedstudent in period.relatedstudent_set.all(): if relatedstudent.id in notready_relatedstudentids: qualifies = None else: qualifies = relatedstudent.id in passing_relatedstudentids qualifies = QualifiesForFinalExam( relatedstudent = relatedstudent, status = status, qualifies = qualifies ) try: qualifies.full_clean() except ValidationError as e: raise ErrorResponse(statuscodes.HTTP_400_BAD_REQUEST, {'details': ' '.join(e.messages)}) qualifies.save() if status.plugin and qualifiesforexam_plugins.has_post_statussave(status): self._invoke_post_statussave(status) return Response(201, '')
def _test_getinstance_as(self, username): relatedStudent1 = self._create_relatedstudent('student1', 'Student One') relatedStudent2 = self._create_relatedstudent('student2', 'Student Two') status = Status( period = self.testhelper.sub_p1, status = 'ready', message = 'Test', user = getattr(self.testhelper, username), plugin = 'devilry_qualifiesforexam.test.noop-plugin' ) status.save() status.students.create(relatedstudent=relatedStudent1, qualifies=True) status.students.create(relatedstudent=relatedStudent2, qualifies=False) content, response = self._getinstanceas(username, self.testhelper.sub_p1.id) self.assertEqual(response.status_code, 200) self.assertEqual(set(content.keys()), set(['id', 'perioddata', 'statuses', u'is_active', u'short_name', u'long_name', u'subject'])) self.assertEqual(content['id'], self.testhelper.sub_p1.id) statuses = content['statuses'] self.assertEqual(len(statuses), 1) self.assertEqual(set(statuses[0].keys()), set([u'id', u'status', u'plugin', u'statustext', u'period', u'passing_relatedstudentids_map', u'user', u'message', u'createtime', u'pluginsettings_summary', u'plugin_description', u'plugin_title'])) self.assertEqual(statuses[0]['period'], self.testhelper.sub_p1.id) self.assertEqual(statuses[0]['status'], 'ready') self.assertEqual(statuses[0]['message'], 'Test') self.assertEqual(statuses[0]['plugin'], 'devilry_qualifiesforexam.test.noop-plugin') self.assertEqual(statuses[0]['pluginsettings_summary'], 'noop summary') self.assertIn(str(relatedStudent1.id), statuses[0]['passing_relatedstudentids_map'])
def post(self, request, id=None): period = self.CONTENT["period"] self._permissioncheck(period) with transaction.commit_on_success(): status = Status( period=period, status=self.CONTENT["status"], message=self.CONTENT["message"], user=self.request.user, plugin=self.CONTENT["plugin"], ) status.full_clean() status.save() if status.status != "notready": passing_relatedstudentids = set(self.CONTENT["passing_relatedstudentids"]) notready_relatedstudentids = set(self.CONTENT["notready_relatedstudentids"]) for relatedstudent in period.relatedstudent_set.all(): if relatedstudent.id in notready_relatedstudentids: qualifies = None else: qualifies = relatedstudent.id in passing_relatedstudentids qualifies = QualifiesForFinalExam(relatedstudent=relatedstudent, status=status, qualifies=qualifies) try: qualifies.full_clean() except ValidationError as e: raise ErrorResponse(statuscodes.HTTP_400_BAD_REQUEST, {"details": " ".join(e.messages)}) qualifies.save() if status.plugin: self._invoke_post_statussave(status) return Response(201, "")
def _createlistteststatus(self, period, status='ready', plugin='devilry_qualifiesforexam.test.noop-plugin'): status = Status( period = period, status = status, message = 'Test', user = self.testhelper.periodadmin, plugin = plugin ) status.full_clean() status.save() return status
def _serialize_period(self, period, userobj, devilry_qualifiesforexam_enabled): qualifies = None if devilry_qualifiesforexam_enabled: try: status = Status.get_current_status(period) except Status.DoesNotExist: pass else: if status.status == Status.READY: try: qualification_status = status.students.get(relatedstudent__user=userobj) qualifies = qualification_status.qualifies except QualifiesForFinalExam.DoesNotExist: pass return { 'id': period.id, 'short_name': period.short_name, 'long_name': period.long_name, 'start_time': format_datetime(period.start_time), 'end_time': format_datetime(period.end_time), 'is_active': period.is_active(), 'is_relatedstudent': period.relatedstudent_set.filter(user=userobj).exists(), 'qualified_forexams': qualifies, 'assignments': MappedList() }
def test_save_settings(self): status = Status(period=self.period, status='ready', message='', user=self.testhelper.periodadmin, plugin='devilry_qualifiesforexam_points' ) status.save() self.assertEqual(PointsPluginSetting.objects.count(), 0) post_statussave(status, { 'assignmentids': [self.testhelper.sub_p1_a1.id, self.testhelper.sub_p1_a2.id], 'minimum_points': 3 }) self.assertEqual(PointsPluginSetting.objects.count(), 1) settings = status.devilry_qualifiesforexam_points_pointspluginsetting self.assertEqual(settings.minimum_points, 3) self.assertEqual(settings.pointspluginselectedassignment_set.count(), 2) ids = set([selected.assignment.id for selected in settings.pointspluginselectedassignment_set.all()]) self.assertEqual(ids, set([self.testhelper.sub_p1_a1.id, self.testhelper.sub_p1_a2.id]))
def test_verify(self): status = Status( period=self.period, status="ready", message="", user=self.testhelper.periodadmin, plugin="devilry_qualifiesforexam_approved.subset", ) status.save() relatedStudent1 = self.create_relatedstudent("student1") status.students.create(relatedstudent=relatedStudent1, qualifies=True) self.create_feedbacks( (self.testhelper.sub_p1_a1_gstudent1, {"grade": "F", "points": 0, "is_passing_grade": False}) ) with self.assertRaises(PluginResultsFailedVerification): post_statussave_subset(status, {"assignmentids_that_must_be_passed": [self.testhelper.sub_p1_a1.id]})
def test_save_settings(self): status = Status( period=self.period, status="ready", message="", user=self.testhelper.periodadmin, plugin="devilry_qualifiesforexam_approved.subset", ) status.save() self.assertEqual(SubsetPluginSetting.objects.count(), 0) post_statussave_subset( status, {"assignmentids_that_must_be_passed": [self.testhelper.sub_p1_a1.id, self.testhelper.sub_p1_a2.id]} ) self.assertEqual(SubsetPluginSetting.objects.count(), 1) settings = status.devilry_qualifiesforexam_approved_subsetpluginsetting self.assertEqual(settings.selectedassignment_set.count(), 2) ids = set([selected.assignment.id for selected in settings.selectedassignment_set.all()]) self.assertEqual(ids, set([self.testhelper.sub_p1_a1.id, self.testhelper.sub_p1_a2.id]))
def test_verify(self): status = Status(period=self.period, status='ready', message='', user=self.testhelper.periodadmin, plugin='devilry_qualifiesforexam_points' ) status.save() relatedStudent1 = self.create_relatedstudent('student1') status.students.create(relatedstudent=relatedStudent1, qualifies=True) self.create_feedbacks( (self.testhelper.sub_p1_a1_gstudent1, {'grade': 'F', 'points': 2, 'is_passing_grade': False}) ) with self.assertRaises(PluginResultsFailedVerification): post_statussave(status, { 'assignmentids': [self.testhelper.sub_p1_a1.id], 'minimum_points': 3 }) post_statussave(status, { 'assignmentids': [self.testhelper.sub_p1_a1.id], 'minimum_points': 2 })
def get_initial(self): """ Returns the initial data to use for forms on this view. """ try: current_status = Status.get_current_status(self.period) except Status.DoesNotExist: return {} else: try: settings = current_status.devilry_qualifiesforexam_approved_subsetpluginsetting except SubsetPluginSetting.DoesNotExist: return {} else: ids = [selected.assignment.id for selected in settings.selectedassignment_set.all()] return {'assignments': ids}
def get_initial(self): """ Returns the initial data to use for forms on this view. """ try: current_status = Status.get_current_status(self.period) except Status.DoesNotExist: pass else: try: settings = current_status.devilry_qualifiesforexam_points_pointspluginsetting except PointsPluginSetting.DoesNotExist: pass else: ids = [selected.assignment.id for selected in settings.pointspluginselectedassignment_set.all()] return {"assignments": ids} ids = [assignment.id for assignment in self.period.assignments.all()] return {"assignments": ids}
def _serialize_period(self, period): out = { 'id': period.id, 'short_name': period.short_name, 'long_name': period.long_name, 'assignments': OrderedDict(), 'is_relatedstudent': period.relatedstudent_set.filter(user=self.user).exists() } if self.devilry_qualifiesforexam_enabled: out['qualifiesforexams'] = None try: status = Status.get_current_status(period) except Status.DoesNotExist: pass else: if status.status == Status.READY: try: qualifies = status.students.get(relatedstudent__user=self.user) out['qualifiesforexams'] = qualifies.qualifies except QualifiesForFinalExam.DoesNotExist: pass return out