コード例 #1
0
ファイル: submissions.py プロジェクト: samsemilia7/SAUCE
    def edit_(self, language=None, source=None, filename=None, **kwargs):
        self._edit_permissions()

        log.info(dict(submission_id=self.submission.id,
            assignment_id=self.assignment.id,
            language=language, filename=filename, source=source))
        #self.submission.assignment = self.assignment
        #if request.student:
        #    self.submission.student = request.student
        if self.submission.language != language:
            self.submission.language = language
        if self.submission.source != source:
            self.submission.source = source
        if self.submission.filename != filename:
            self.submission.filename = filename
        if self.submission in DBSession.dirty:
            self.submission.modified = datetime.now()
            DBSession.add(self.submission)
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Submission %d could not be saved', self.submission.id, exc_info=True)
            flash('Your submission could not be saved!', 'error')
            redirect(self.submission.url + '/edit')
        else:
            redirect(self.submission.url + '/result')
コード例 #2
0
ファイル: assignments.py プロジェクト: Ayutac/SAUCE
    def submit(self, *args, **kwargs):
        '''Create new submission for this assignment'''
        if 'manage' not in request.permissions and \
                request.user not in set(self.event.members) | set(self.event.tutorsandteachers):
            abort(403)
        if (not self.assignment.is_active and
                not request.allowance(self.assignment)):
            flash('This assignment is not active, you may not create a submission', 'warning')
            redirect(url(self.assignment.url))

        submission = Submission(
            assignment=self.assignment,
            filename=self.assignment.submission_filename or None,
            source=self.assignment.submission_template or None,
            language=self.assignment.allowed_languages[0] if self.assignment.allowed_languages else None,
            user=request.user,
            created=datetime.now(),
            modified=datetime.now(),
        )
        DBSession.add(submission)
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Error creating new submission', exc_info=True)
            flash('Error creating new submission', 'error')
            redirect(url(self.assignment.url))
        else:
            redirect(url(submission.url + '/edit'))
コード例 #3
0
ファイル: submissions.py プロジェクト: samsemilia7/SAUCE
    def judge_(self, grade=None, comment=None, corrected_source=None, annotations=None, **kwargs):
        self._judge_permissions()

        judgement_annotations = dict()
        if annotations:
            keyfunc = lambda d: d['line']
            for k, g in groupby(sorted(annotations, key=keyfunc), key=keyfunc):
                judgement_annotations[k] = ', '.join((d['comment'] for d in g))

        judgement_attrs = dict(
            grade=grade, comment=comment, corrected_source=corrected_source,
            annotations=judgement_annotations or None,
        )

        if any((True for x in judgement_attrs.itervalues() if x is not None)):
            # Judgement is not empty
            judgement = self.submission.judgement or Judgement(submission=self.submission)
            judgement.tutor = request.user
            judgement.date = datetime.now()
            for k in judgement_attrs:
                setattr(judgement, k, judgement_attrs[k])
        else:
            # Judgement is empty
            judgement = None

        self.submission.judgement = judgement

        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Submission %d, judgement could not be saved:', self.submission.id, exc_info=True)
            flash('Error saving judgement', 'error')

        redirect(self.submission.url + '/judge')
コード例 #4
0
    def submit(self, *args, **kwargs):
        '''Create new submission for this assignment'''
        if 'manage' not in request.permissions and \
                request.user not in set(self.event.members) | set(self.event.tutorsandteachers):
            abort(403)
        if (not self.assignment.is_active
                and not request.allowance(self.assignment)):
            flash(
                'This assignment is not active, you may not create a submission',
                'warning')
            redirect(url(self.assignment.url))

        submission = Submission(
            assignment=self.assignment,
            filename=self.assignment.submission_filename or None,
            source=self.assignment.submission_template or None,
            language=self.assignment.allowed_languages[0]
            if self.assignment.allowed_languages else None,
            user=request.user,
            created=datetime.now(),
            modified=datetime.now(),
        )
        DBSession.add(submission)
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Error creating new submission', exc_info=True)
            flash('Error creating new submission', 'error')
            redirect(url(self.assignment.url))
        else:
            redirect(url(submission.url + '/edit'))
コード例 #5
0
ファイル: lti.py プロジェクト: sleeepyjack/SAUCE
    def edit_(self, *args, **kwargs):
        self._get_session_data()

        v = SubmissionForm.validate(kwargs)
        language = v['language']
        source = v['source']
        filename = v['filename']

        self.submission.assignment = self.assignment
        self.submission.user = self.user
        if self.submission.language != language:
            self.submission.language = language
        if self.submission.source != source:
            self.submission.source = source
        if self.submission.filename != filename:
            self.submission.filename = filename
        if self.submission in DBSession.dirty:
            self.submission.modified = datetime.now()
            DBSession.add(self.submission)
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Submission %r could not be saved',
                     self.submission,
                     exc_info=True)
            flash('Your submission could not be saved!', 'error')
            redirect('./edit')
        else:
            #             redirect(self.submission.url + '/result')
            pass

        (compilation, testruns, result) = self.submission.run_tests()

        testruns = sorted(set(self.submission.testruns), key=lambda s: s.date)
        result = self.submission.result

        if result is True:
            score = 1.0
        else:
            if testruns:
                score = (float(len([t for t in testruns if t.result])) /
                         float(len(testruns)))
            else:
                score = 0.0
        send = self._send_result(score, str(result))
        log.info(send)

        return dict(assignment=self.assignment,
                    submission=self.submission,
                    user=self.user,
                    compilation=compilation,
                    testruns=testruns,
                    result=result,
                    score=score)
コード例 #6
0
ファイル: lti.py プロジェクト: moschlar/SAUCE
    def edit_(self, *args, **kwargs):
        self._get_session_data()

        v = SubmissionForm.validate(kwargs)
        language = v["language"]
        source = v["source"]
        filename = v["filename"]

        self.submission.assignment = self.assignment
        self.submission.user = self.user
        if self.submission.language != language:
            self.submission.language = language
        if self.submission.source != source:
            self.submission.source = source
        if self.submission.filename != filename:
            self.submission.filename = filename
        if self.submission in DBSession.dirty:
            self.submission.modified = datetime.now()
            DBSession.add(self.submission)
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn("Submission %r could not be saved", self.submission, exc_info=True)
            flash("Your submission could not be saved!", "error")
            redirect("./edit")
        else:
            #             redirect(self.submission.url + '/result')
            pass

        (compilation, testruns, result) = self.submission.run_tests()

        testruns = sorted(set(self.submission.testruns), key=lambda s: s.date)
        result = self.submission.result

        if result is True:
            score = 1.0
        else:
            if testruns:
                score = float(len([t for t in testruns if t.result])) / float(len(testruns))
            else:
                score = 0.0
        send = self._send_result(score, str(result))
        log.info(send)

        return dict(
            assignment=self.assignment,
            submission=self.submission,
            user=self.user,
            compilation=compilation,
            testruns=testruns,
            result=result,
            score=score,
        )
コード例 #7
0
ファイル: __init__.py プロジェクト: sleeepyjack/SAUCE
 def setUp(self):
     """Prepare model test fixture."""
     try:
         new_attrs = {}
         new_attrs.update(self.attrs)
         new_attrs.update(self.do_get_dependencies())
         self.obj = self.klass(**new_attrs)
         DBSession.add(self.obj)
         DBSession.flush()
         return self.obj
     except:
         DBSession.rollback()
         raise
コード例 #8
0
ファイル: __init__.py プロジェクト: pombredanne/SAUCE-2
 def setUp(self):
     """Prepare model test fixture."""
     try:
         new_attrs = {}
         new_attrs.update(self.attrs)
         new_attrs.update(self.do_get_dependencies())
         self.obj = self.klass(**new_attrs)
         DBSession.add(self.obj)
         DBSession.flush()
         return self.obj
     except:
         DBSession.rollback()
         raise
コード例 #9
0
    def post(self, *args, **kwargs):
        '''Process form data into user profile'''

        if config.features.get('externalauth', False):  # pragma: no cover
            flash(
                'Profile changes are not possible because external authentication is used!',
                'error')
            redirect(url('/user/profile'))

        user = DBSession.merge(request.user)

        #        try:
        #            d = User.query.filter_by(email_address=kwargs['email_address']).one()
        #        except:
        #            pass
        #        else:
        #            if d.user_name != request.user.user_name:
        #                flash('The email address "%s" is already registered!' % (kwargs['email_address']), 'error')
        #                redirect(url('/user/profile'))

        try:
            user._display_name = kwargs.get('display_name', '')
            #            user.first_name = kwargs['first_name']
            #            user.last_name = kwargs['last_name']
            user.email_address = kwargs.get('email_address', '')
            # Only attempt to change password if both values are set
            if (kwargs.get('password_1', None) and kwargs.get(
                    'password_1', None) == kwargs.get('password_2', None)):
                user.password = kwargs.get('password_1', '')
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warning('Error modifying profile of User %r',
                        user,
                        exc_info=True)
            flash('Error modifying profile', 'error')
        except:
            log.warning('Error modifying profile of User %r',
                        user,
                        exc_info=True)
            flash('Error modifying profile', 'error')
        else:
            flash('Profile modified', 'ok')
        finally:
            redirect(url('/user/profile'))
コード例 #10
0
ファイル: assignments.py プロジェクト: samsemilia7/SAUCE
    def submit(self):
        '''Create new submission for this assignment'''
        if not self.assignment.is_active and \
                not request.allowance(self.assignment):
            flash('This assignment is not active, you may not create a submission', 'warning')
            redirect(url(self.assignment.url))

        submission = Submission(assignment=self.assignment, user=request.user,
                                created=datetime.now())
        DBSession.add(submission)
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Error creating new submission', exc_info=True)
            flash('Error creating new submission', 'error')
            redirect(url(self.assignment.url))
        else:
            redirect(url(submission.url + '/edit'))
コード例 #11
0
ファイル: submissions.py プロジェクト: samsemilia7/SAUCE
    def clone(self):
        s = Submission(
            user=request.user,
            assignment=self.submission.assignment,
            filename=self.submission.filename,
            source=self.submission.source,
            language=self.submission.language,
        )

        DBSession.add(s)

        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            flash('Error cloning submission', 'error')
            redirect(url(self.submission.url + '/show'))
        finally:
            s = DBSession.merge(s)
            flash('Cloned submission %d from %d' % (s.id, self.submission.id), 'ok')
            redirect(url(s.url + '/show'))
コード例 #12
0
ファイル: submissions.py プロジェクト: sleeepyjack/SAUCE
    def public(self, target=None, *args, **kwargs):
        self._edit_permissions()

        if target is not None:
            # Set
            target = asbool(target)
        else:
            # Toggle
            target = not self.submission.public
        self.submission.public = target
        _url = getattr(request, 'referer', None) or self.submission.url
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Submission %r, could not change publicity status to %s',
                self.submission, target, exc_info=True)
            flash('Error changing publicity status to %s' % ('public' if target else 'private'), 'error')
        finally:
            flash('Changed publicity status to %s' % ('public' if target else 'private'), 'ok')
        redirect(_url)
コード例 #13
0
ファイル: assignments.py プロジェクト: samsemilia7/SAUCE
    def submit(self):
        '''Create new submission for this assignment'''
        if not self.assignment.is_active and \
                not request.allowance(self.assignment):
            flash(
                'This assignment is not active, you may not create a submission',
                'warning')
            redirect(url(self.assignment.url))

        submission = Submission(assignment=self.assignment,
                                user=request.user,
                                created=datetime.now())
        DBSession.add(submission)
        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Error creating new submission', exc_info=True)
            flash('Error creating new submission', 'error')
            redirect(url(self.assignment.url))
        else:
            redirect(url(submission.url + '/edit'))
コード例 #14
0
ファイル: submissions.py プロジェクト: sleeepyjack/SAUCE
    def judge_(self, grade=None, comment=None, corrected_source=None, annotations=None,
            public=None, *args, **kwargs):

        self._judge_permissions()

        judgement_annotations = None
        if annotations:
            key = lambda d: d['line']
            judgement_annotations = dict(
                (k, ', '.join((d['comment'] for d in g if d['comment'])))
                    for k, g in groupby(sorted(annotations, key=key), key=key)
            )

        judgement_attrs = dict(
            grade=grade, comment=comment, corrected_source=corrected_source,
            annotations=judgement_annotations or None, public=public,
        )

        if any((True for x in judgement_attrs.itervalues() if x is not None)):
            # Judgement is not empty
            judgement = self.submission.judgement or Judgement(submission=self.submission)
            judgement.tutor = request.user
            judgement.date = datetime.now()
            for k in judgement_attrs:
                setattr(judgement, k, judgement_attrs[k])
        else:
            # Judgement is empty
            judgement = None

        self.submission.judgement = judgement

        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Submission %r, judgement could not be saved:', self.submission, exc_info=True)
            flash('Error saving judgement', 'error')

        redirect(self.submission.url + '/judge')
コード例 #15
0
ファイル: submissions.py プロジェクト: sleeepyjack/SAUCE
    def clone(self, *args, **kwargs):
        s = Submission(
            user=request.user,
            assignment=self.submission.assignment,
            filename=self.submission.filename,
            source=self.submission.source,
            language=self.submission.language,
            # TODO: Clone comment or not?
        )

        DBSession.add(s)

        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            flash('Error cloning submission', 'error')
            redirect(url(self.submission.url + '/show'))
        finally:
            s = DBSession.merge(s)
            flash('Cloned submission %d from %d' % (s.id, self.submission.id), 'ok')
            redirect(url(s.url + '/show'))
コード例 #16
0
ファイル: user.py プロジェクト: Ayutac/SAUCE
    def post(self, *args, **kwargs):
        '''Process form data into user profile'''

        if config.features.get('externalauth', False):  # pragma: no cover
            flash('Profile changes are not possible because external authentication is used!', 'error')
            redirect(url('/user/profile'))

        user = DBSession.merge(request.user)

#        try:
#            d = User.query.filter_by(email_address=kwargs['email_address']).one()
#        except:
#            pass
#        else:
#            if d.user_name != request.user.user_name:
#                flash('The email address "%s" is already registered!' % (kwargs['email_address']), 'error')
#                redirect(url('/user/profile'))

        try:
            user._display_name = kwargs.get('display_name', '')
#            user.first_name = kwargs['first_name']
#            user.last_name = kwargs['last_name']
            user.email_address = kwargs.get('email_address', '')
            # Only attempt to change password if both values are set
            if (kwargs.get('password_1', None) and
                    kwargs.get('password_1', None) == kwargs.get('password_2', None)):
                user.password = kwargs.get('password_1', '')
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warning('Error modifying profile of User %r', user, exc_info=True)
            flash('Error modifying profile', 'error')
        except:
            log.warning('Error modifying profile of User %r', user, exc_info=True)
            flash('Error modifying profile', 'error')
        else:
            flash('Profile modified', 'ok')
        finally:
            redirect(url('/user/profile'))
コード例 #17
0
ファイル: submissions.py プロジェクト: samsemilia7/SAUCE
 def delete(self):
     subm_id = self.submission.id
     subm_url = self.submission.url
     try:
         if (getattr(request, 'user', None) == self.submission.user or
                 request.allowance(self.submission)):
             DBSession.delete(self.submission)
             DBSession.flush()
         else:
             #abort(403)
             flash('You have no permission to delete this Submission', 'warning')
             redirect(url(self.submission.url + '/show'))
     except SQLAlchemyError:
         DBSession.rollback()
         log.warn('Submission %d could not be deleted', self.submission.id, exc_info=True)
         flash('Submission could not be deleted', 'error')
         redirect(url(self.submission.url + '/show'))
     else:
         flash('Submission %d deleted' % (subm_id), 'ok')
         if request.referer and not subm_url in request.referer:
             # Most likely coming from the submission overview page
             redirect(request.referer)
         else:
             redirect(url(self.assignment.url))
コード例 #18
0
ファイル: submissions.py プロジェクト: sleeepyjack/SAUCE
    def edit_(self, language=None, source=None, filename=None, comment=None, *args, **kwargs):
        self._edit_permissions()

        log.debug(dict(submission_id=self.submission.id,
            assignment_id=self.assignment.id,
            language=language, filename=filename, source=source))

        #self.submission.assignment = self.assignment
        #if request.student:
        #    self.submission.student = request.student
        if self.submission.language != language:
            self.submission.language = language
        if self.submission.source != source:
            self.submission.source = source
        if self.submission.filename != filename:
            self.submission.filename = filename

        # TODO: Only changing the comment should not trigger re-testing, but it does.
        if self.submission.comment != comment:
            self.submission.comment = comment

        if self.submission in DBSession.dirty:
            self.submission.modified = datetime.now()

        if self.submission in DBSession.dirty:
            DBSession.add(self.submission)

        try:
            DBSession.flush()
        except SQLAlchemyError:
            DBSession.rollback()
            log.warn('Submission %r could not be saved', self.submission, exc_info=True)
            flash('Your submission could not be saved!', 'error')
            redirect(self.submission.url + '/edit')
        else:
            redirect(self.submission.url + '/result')
コード例 #19
0
ファイル: submissions.py プロジェクト: sleeepyjack/SAUCE
 def delete(self, *args, **kwargs):
     subm_id = self.submission.id
     subm_url = self.submission.url
     try:
         if (getattr(request, 'user', None) == self.submission.user or
                 request.allowance(self.submission)):
             DBSession.delete(self.submission)
             DBSession.flush()
         else:
             #abort(403)
             flash('You have no permission to delete this Submission', 'warning')
             redirect(url(self.submission.url + '/show'))
     except SQLAlchemyError:
         DBSession.rollback()
         log.warn('Submission %r could not be deleted', self.submission, exc_info=True)
         flash('Submission could not be deleted', 'error')
         redirect(url(self.submission.url + '/show'))
     else:
         flash('Submission %d deleted' % (subm_id), 'ok')
         if request.referer and not subm_url in request.referer:
             # Most likely coming from the submission overview page
             redirect(request.referer)
         else:
             redirect(url(self.assignment.url))
コード例 #20
0
ファイル: __init__.py プロジェクト: pombredanne/SAUCE-2
 def tearDown(self):
     """Finish model test fixture."""
     DBSession.rollback()
コード例 #21
0
ファイル: __init__.py プロジェクト: sleeepyjack/SAUCE
 def tearDown(self):
     """Finish model test fixture."""
     DBSession.rollback()