def put(self, request, id):
        self.assignment = self._get_assignment(id)
        marker = MarkAsPassedInPreviousPeriod(self.assignment)
        gradeeditor_config, shortformat = self._get_gradeeditor_config_and_shortformat()
        with transaction.commit_on_success():
            for item in self.CONTENT:
                group = self.assignment.assignmentgroups.get(id=item['id'])
                newfeedback_shortformat = item['newfeedback_shortformat']
                try:
                    shortformat.validate(gradeeditor_config, newfeedback_shortformat)
                except ShortFormatValidationError as e:
                    raise ValidationErrorResponse(e)
                feedback = shortformat.to_staticfeedback_kwargs(gradeeditor_config, newfeedback_shortformat)
                if not feedback['is_passing_grade']:
                    raise BadRequestFieldError('newfeedback_shortformat', 'Must be a passing grade')
                feedback['rendered_view'] = ''
                feedback['saved_by'] = self.request.user

                oldgroup = None
                try:
                    oldgroup = marker.find_previously_passed_group(group)
                except MarkAsPassedInPreviousPeriodError:
                    pass
                created_feedback = marker.mark_as_delivered_in_previous(group, oldgroup=oldgroup,
                        feedback=feedback)
        return self._get_result()
    def handle(self, *args, **kwargs):
        from devilry.apps.core.models import Subject, Period, Assignment

        if len(args) != 3:
            raise CommandError('Subject, period and assignment short_name is required. See --help.')
        subject_short_name = args[0]
        period_short_name = args[1]
        assignment_short_name = args[2]

        subject = self._get_or_error(Subject, short_name=subject_short_name)
        period = self._get_or_error(Period, short_name=period_short_name,
                                    parentnode=subject)
        assignment = self._get_or_error(Assignment, short_name=assignment_short_name,
                                        parentnode=period)

        marker = MarkAsPassedInPreviousPeriod(assignment)
        result = marker.mark_all(pretend=kwargs['pretend'])
        print
        print '#' * 70
        print '# Ignored groups, ordered by reason for ignoring'
        print '#' * 70
        for reason, groups in result['ignored'].iteritems():
            print
            print reason
            print '-' * 70
            pprint(groups)

        print
        print '#' * 70
        print '# Groups marked as passed in previous period'
        print '#' * 70
        marked = result['marked']
        if marked:
            for group, oldgroup in result['marked']:
                feedback = oldgroup.feedback
                if feedback.is_passing_grade:
                    status = 'Passed'
                else:
                    status = 'Failed'
                print '- {0}'.format(group)
                print '     copied from: {0}'.format(oldgroup)
                print '     feedback: {0} ({1}) (points:{2})'.format(status,
                                                                     feedback.grade,
                                                                     feedback.points)
        else:
            print 'No groups with passing grade in previous periods found'
    def put(self, request, id):
        self.assignment = self._get_assignment(id)
        marker = MarkAsPassedInPreviousPeriod(self.assignment)
        with transaction.commit_on_success():
            for item in self.CONTENT:
                group = self.assignment.assignmentgroups.get(id=item['id'])
                newfeedback_points = item['newfeedback_points']
                feedback = StaticFeedback.from_points(
                    assignment=self.assignment,
                    points=newfeedback_points,
                    rendered_view='',
                    saved_by=self.request.user)
                if not feedback.is_passing_grade:
                    raise BadRequestFieldError('newfeedback_points', 'Must be a passing grade')

                oldgroup = None
                try:
                    oldgroup = marker.find_previously_passed_group(group)
                except MarkAsPassedInPreviousPeriodError:
                    pass
                marker.mark_as_delivered_in_previous(group, oldgroup=oldgroup, feedback=feedback)
        return self._get_result()
 def _get_result(self):
     marker = MarkAsPassedInPreviousPeriod(self.assignment)
     result = marker.mark_all(pretend=True)
     gradeeditor_config, shortformat = self._get_gradeeditor_config_and_shortformat()
     return ResultSerializer(gradeeditor_config, shortformat, result).serialize()
 def _get_result(self):
     marker = MarkAsPassedInPreviousPeriod(self.assignment)
     result = marker.mark_all(pretend=True)
     return ResultSerializer(result).serialize()