예제 #1
0
    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')
예제 #2
0
 def setUp(self):
     super(TestEnrolling, self).setUp()
     self.user = User(user_name='studentxxx',
                      display_name='Student XXX',
                      email_address='*****@*****.**')
     DBSession.add(self.user)
     transaction.commit()
     self.extra_environ = dict(REMOTE_USER=self.user.user_name)
예제 #3
0
파일: test_enroll.py 프로젝트: Ayutac/SAUCE
    def test_enroll_event(self):
        """Enrolling for Event"""
        demo = self.configure_event('demo', 'event', None)

        response = self.app.get('/events/demo/enroll', extra_environ=self.extra_environ)
        response = response.follow()
        response.mustcontain('Enrolled for Event', 'Programming 101 - Demo')
        user = DBSession.merge(self.user)
        demo = DBSession.merge(demo)
        assert user in demo.members
        assert demo in user._events
예제 #4
0
    def run_tests(self):

        compilation = None
        testruns = []
        result = False

        # Consistency checks
        if self.language and self.source and self.assignment:
            with Runner(self) as r:
                log.debug('Starting Runner for submission %d' % self.id)
                # First compile, if needed
                compilation = r.compile()
                if compilation:
                    log.debug('Compilation runtime: %f' % compilation.runtime)
                    log.debug('Compilation result: %s' % compilation.result)

                if not compilation or compilation.result:
                    # Delete old testruns
                    self.testruns = []
                    #DBSession.flush()

                    # Then run all the tests
                    testruns = []
                    start = time()
                    for t in r.test():
                        testruns.append(t)
                        self.testruns.append(
                            Testrun(
                                submission=self,
                                test=t.test,
                                result=t.result,
                                partial=t.partial,
                                runtime=t.runtime,
                                output_data=t.output_data,
                                error_data=t.error_data,
                            ))
                    end = time()
                    test_time = end - start
                    log.debug('Test runs total runtime: %f' % test_time)
                    log.debug('Test runs results: %s' %
                              ', '.join(str(t.result) for t in testruns))

                    try:
                        DBSession.flush()
                    except:
                        log.exception('Could not save testrun results')
                        raise

                    result = self.result
                    log.debug('Test runs result: %s ' % result)
                else:
                    log.debug('Test runs not run')
        return (compilation, testruns, result)
예제 #5
0
    def test_enroll_event(self):
        """Enrolling for Event"""
        demo = self.configure_event('demo', 'event', None)

        response = self.app.get('/events/demo/enroll',
                                extra_environ=self.extra_environ)
        response = response.follow()
        response.mustcontain('Enrolled for Event', 'Programming 101 - Demo')
        user = DBSession.merge(self.user)
        demo = DBSession.merge(demo)
        assert user in demo.members
        assert demo in user._events
예제 #6
0
 def test_integration_2(self):
     test = Test(
         assignment_id=42,
         output_data=u'42 Bananas\n4711 Strawberrys\n1337 Apples\n',
         splitlines=True, sort=True,
     )
     DBSession.add(test)
     DBSession.flush()
     test = DBSession.merge(test)
     d = u'#Result:\n4711 Strawberrys\n42 Bananas\n1337 Apples\n'
     result, _, expected, output, _ = test.validate(d)
     converted_output = test.unconvert(test.convert(d))
     assert result is True, (expected, output, converted_output)
예제 #7
0
파일: submission.py 프로젝트: Ayutac/SAUCE
    def run_tests(self):

        compilation = None
        testruns = []
        result = False

        # Consistency checks
        if self.language and self.full_source and self.assignment:
            with Runner(self) as r:
                log.debug('Starting Runner for submission %r', self)
                # First compile, if needed
                compilation = r.compile()
                if compilation:
                    log.debug('Compilation runtime: %f', compilation.runtime)
                    log.debug('Compilation result: %s', compilation.result)

                if not compilation or compilation.result:
                    # Delete old testruns
                    self.testruns = []
                    #DBSession.flush()

                    # Then run all the tests
                    testruns = []
                    start = time()
                    for t in r.test():
                        testruns.append(t)
                        self.testruns.append(
                            Testrun(
                                submission=self, test=t.test,
                                result=t.result, partial=t.partial,
                                runtime=t.runtime,
                                output_data=t.output_data,
                                error_data=t.error_data,
                            )
                        )
                    end = time()
                    test_time = end - start
                    log.debug('Test runs total runtime: %f', test_time)
                    log.debug('Test runs results: %r', list(str(t.result) for t in testruns))

                    try:
                        DBSession.flush()
                    except:
                        log.exception('Could not save testrun results')
                        raise

                    result = self.result
                    log.debug('Test runs result: %s ', result)
                else:
                    log.debug('Test runs not run')
        return (compilation, testruns, result)
예제 #8
0
 def test_integration_1(self):
     test = Test(
         assignment_id=42,
         output_data=u'1.0,2.0,3.0\n4.0,5.0,6.0\n7.0,8.0,9.0\n',
         separator=',', split=True, splitlines=True,
         parse_float=True, float_precision=1,
     )
     DBSession.add(test)
     DBSession.flush()
     test = DBSession.merge(test)
     d = u'#Result:\n1,2,3\n4,5,6\n,7,8,9\n'
     result, _, expected, output, _ = test.validate(d)
     converted_output = test.unconvert(test.convert(d))
     assert result is True, (expected, output, converted_output)
예제 #9
0
def main():
    args = parse_args()
    load_config(args.conf_file)

    #print model.DBSession.query(model.User.user_name).all()

    events = Session.query(model.Event).all()

    print[(i, e.name) for i, e in enumerate(events)]

    event_id = raw_input('event_id: ')
    event = events[int(event_id)]

    fix_languages = raw_input("Allow all languages on all assignments? [y]")

    if fix_languages == 'y':
        l = Session.query(model.Language).all()

        for a in Session.query(
                model.Assignment).filter_by(event_id=event.id).all():
            a = Session.merge(a)
            a.allowed_languages = l
            Session.add(a)

        try:
            transaction.commit()
        except IntegrityError:
            print traceback.format_exc()
            transaction.abort()

    fix_visible_tests = raw_input(
        "Fix boolean visible attribute on tests? [y]")

    if fix_visible_tests == 'y':
        for a in Session.query(
                model.Assignment).filter_by(event_id=event.id).all():
            a = Session.merge(a)
            print u'Assignment: %s' % a.name
            for t in a.tests:
                print u'Test %d, Output length %d' % (t.id, len(t.output))
                visible = raw_input('Make test visible? [y]')
                if visible == 'y':
                    t.visible = True
                    Session.add(t)
            try:
                transaction.commit()
            except IntegrityError:
                print traceback.format_exc()
                transaction.abort()
예제 #10
0
def _test_attr(args):
    kwargs, expected_output_data, good_output_data = args[0:3]
    bad_output_data = args[4:]
    test = Test(assignment_id=42, output_data=expected_output_data, **kwargs)
    DBSession.add(test)
    DBSession.flush()
    test = DBSession.merge(test)

    for d in good_output_data:
        result, _, expected, output, _ = test.validate(d)
        converted_output = test.unconvert(test.convert(d))
        assert result is True, (expected, output, converted_output)
    for d in bad_output_data:
        result, _, expected, output, _ = test.validate(d)
        converted_output = test.unconvert(test.convert(d))
        assert result is False, (expected, output, converted_output)
예제 #11
0
파일: scores.py 프로젝트: samsemilia7/SAUCE
    def index(self):

        assignment_query = DBSession.query(Assignment)
        submission_query = DBSession.query(Submission).join(Assignment)
        team_query = DBSession.query(Team)
        if self.event_id:
            assignment_query = assignment_query.filter(
                Assignment.event_id == self.event_id)
            submission_query = submission_query.filter(
                Assignment.event_id == self.event_id)
            #team_query = team_query.join(team_to_event).filter_by(event_id=self.event_id)

        teams = team_query.all()
        for team in teams:
            team.score = 0
            team.count = 0
            team.assignments = []

        for assignment in assignment_query.all():
            assignment.done = {}
            assignment.solution = {}
            for submission in (submission
                               for submission in assignment.submissions
                               if submission.result is not None):
                try:
                    assert submission.team in teams
                    if not assignment.done.get(submission.team.id):
                        if submission.testrun.result:
                            submission.team.score += int(
                                (submission.testrun.date -
                                 assignment.start_time).seconds / 60)
                            submission.team.count += 1
                            assignment.done[submission.team.id] = True
                            assignment.solution[
                                submission.team.id] = submission
                            submission.team.assignments.append(assignment)
                        else:
                            submission.team.score += penalty
                except Exception as e:
                    log.warn('Error in submission %d: %s' % (submission.id, e))

        teams = sorted(sorted(teams, key=lambda team: team.score),
                       key=lambda team: team.count,
                       reverse=True)

        return dict(page='scores', event=self.event, teams=teams)
예제 #12
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'))
예제 #13
0
파일: fix.py 프로젝트: samsemilia7/SAUCE
def main():
    args = parse_args()
    load_config(args.conf_file)

    #print model.DBSession.query(model.User.user_name).all()

    events = Session.query(model.Event).all()

    print [(i, e.name) for i,e in enumerate(events)]
예제 #14
0
def main():
    args = parse_args()
    load_config(args.conf_file)

    #print model.DBSession.query(model.User.user_name).all()

    events = Session.query(model.Event).all()

    print[(i, e.name) for i, e in enumerate(events)]

    event_id = raw_input('event_id: ')
    event = events[int(event_id)]

    while True:
        teamname = raw_input("Team-Name: ")
        if not isinstance(teamname, unicode):
            teamname = teamname.decode('utf-8')
        password = getpass("Password: "******"Next Team? [y]")
        if next != 'y':
            break
예제 #15
0
    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)
예제 #16
0
    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')
예제 #17
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'))
예제 #18
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'))
예제 #19
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'))
예제 #20
0
    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')
예제 #21
0
파일: test_enroll.py 프로젝트: Ayutac/SAUCE
    def test_enroll_lesson(self):
        """Enrolling for Lesson"""
        demo = self.configure_event('demo', 'lesson', None)

        response = self.app.get('/events/demo/enroll', extra_environ=self.extra_environ)
        response.mustcontain('Lesson A/B', 'Lesson C/D', 'Lesson E')

        response.form.set('lesson', 1)
        response = response.form.submit(extra_environ=self.extra_environ)

        user = DBSession.merge(self.user)
        lesson = Lesson.query.filter_by(id=1).one()
        assert user in lesson.members
        assert lesson in user._lessons
예제 #22
0
파일: scores.py 프로젝트: samsemilia7/SAUCE
    def index(self):

        assignment_query = DBSession.query(Assignment)
        submission_query = DBSession.query(Submission).join(Assignment)
        team_query = DBSession.query(Team)
        if self.event_id:
            assignment_query = assignment_query.filter(Assignment.event_id == self.event_id)
            submission_query = submission_query.filter(Assignment.event_id == self.event_id)
            #team_query = team_query.join(team_to_event).filter_by(event_id=self.event_id)

        teams = team_query.all()
        for team in teams:
            team.score = 0
            team.count = 0
            team.assignments = []

        for assignment in assignment_query.all():
            assignment.done = {}
            assignment.solution = {}
            for submission in (submission for submission in assignment.submissions if submission.result is not None):
                try:
                    assert submission.team in teams
                    if not assignment.done.get(submission.team.id):
                        if submission.testrun.result:
                            submission.team.score += int((submission.testrun.date - assignment.start_time).seconds / 60)
                            submission.team.count += 1
                            assignment.done[submission.team.id] = True
                            assignment.solution[submission.team.id] = submission
                            submission.team.assignments.append(assignment)
                        else:
                            submission.team.score += penalty
                except Exception as e:
                    log.warn('Error in submission %d: %s' % (submission.id, e))

        teams = sorted(sorted(teams, key=lambda team: team.score), key=lambda team: team.count, reverse=True)

        return dict(page='scores', event=self.event, teams=teams)
예제 #23
0
    def test_enroll_lesson(self):
        """Enrolling for Lesson"""
        demo = self.configure_event('demo', 'lesson', None)

        response = self.app.get('/events/demo/enroll',
                                extra_environ=self.extra_environ)
        response.mustcontain('Lesson A/B', 'Lesson C/D', 'Lesson E')

        response.form.set('lesson', 1)
        response = response.form.submit(extra_environ=self.extra_environ)

        user = DBSession.merge(self.user)
        lesson = Lesson.query.filter_by(id=1).one()
        assert user in lesson.members
        assert lesson in user._lessons
예제 #24
0
파일: lti.py 프로젝트: sleeepyjack/SAUCE
    def index(self, *args, **kwargs):
        try:
            server = oauth2.Server()
            server.add_signature_method(oauth2.SignatureMethod_HMAC_SHA1())
            req = oauth2.Request.from_request(request.method, request.url,
                                              request.headers, request.params,
                                              request.query_string)
            params = server.verify_request(
                req, oauth2.Consumer(self.key, self.secret), None)
        except:
            log.debug('LTI Tool Provider OAuth Error', exc_info=True)
            flash('LTI Tool Provider OAuth Error', 'error')
            abort(403)
        else:
            log.debug(params)

        user_name = (
            params.get('tool_consumer_info_product_family_code', 'external') +
            '_' + params.get('tool_consumer_instance_guid', 'external') + '_' +
            params.get('user_id'))

        user = User.query.filter_by(user_name=user_name).first()
        if not user:
            log.info('New user %s', user_name)
            user = User(
                user_name=user_name,
                display_name=params.get('lis_person_name_full'),
                email_address=params.get('lis_person_contact_email_primary'),
            )
            DBSession.add(user)

        submission = Submission.query.filter(
            Submission.assignment == self.assignment,
            Submission.user == user).first()
        if not submission:
            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],
                user=user,
                created=datetime.now(),
                modified=datetime.now(),
            )
            DBSession.add(submission)

            DBSession.flush()

        session['lti'] = True
        session['params'] = params
        session['user'] = user.id
        session['submission'] = submission.id
        session.save()

        redirect('/lti/%d/edit' % self.assignment.id)
예제 #25
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)
예제 #26
0
파일: lti.py 프로젝트: moschlar/SAUCE
    def index(self, *args, **kwargs):
        try:
            server = oauth2.Server()
            server.add_signature_method(oauth2.SignatureMethod_HMAC_SHA1())
            req = oauth2.Request.from_request(
                request.method, request.url, request.headers, request.params, request.query_string
            )
            params = server.verify_request(req, oauth2.Consumer(self.key, self.secret), None)
        except:
            log.debug("LTI Tool Provider OAuth Error", exc_info=True)
            flash("LTI Tool Provider OAuth Error", "error")
            abort(403)
        else:
            log.debug(params)

        user_name = (
            params.get("tool_consumer_info_product_family_code", "external")
            + "_"
            + params.get("tool_consumer_instance_guid", "external")
            + "_"
            + params.get("user_id")
        )

        user = User.query.filter_by(user_name=user_name).first()
        if not user:
            log.info("New user %s", user_name)
            user = User(
                user_name=user_name,
                display_name=params.get("lis_person_name_full"),
                email_address=params.get("lis_person_contact_email_primary"),
            )
            DBSession.add(user)

        submission = Submission.query.filter(Submission.assignment == self.assignment, Submission.user == user).first()
        if not submission:
            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],
                user=user,
                created=datetime.now(),
                modified=datetime.now(),
            )
            DBSession.add(submission)

            DBSession.flush()

        session["lti"] = True
        session["params"] = params
        session["user"] = user.id
        session["submission"] = submission.id
        session.save()

        redirect("/lti/%d/edit" % self.assignment.id)
예제 #27
0
파일: language.py 프로젝트: Ayutac/SAUCE
    def _default(self, language_id, *args, **kwargs):
        try:
            language_id = int(language_id)
            language = DBSession.query(Language).filter_by(id=language_id).one()
        except ValueError:
            flash('Invalid Language id: %s' % language_id, 'error')
            abort(400)
        except NoResultFound:
            flash('Language %d not found' % language_id, 'error')
            abort(404)
        except MultipleResultsFound:  # pragma: no cover
            log.error('Database inconsistency: Language %d', language_id, exc_info=True)
            flash('An error occurred while accessing Language %d' % language_id, 'error')
            abort(500)

        return dict(page='language', language=language, languages=None)
예제 #28
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,
        )
예제 #29
0
 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
예제 #30
0
 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
예제 #31
0
파일: test_enroll.py 프로젝트: Ayutac/SAUCE
    def test_enroll_team_new(self):
        """Enrolling for New Team"""
        demo = self.configure_event('demo', 'team_new', None)

        response = self.app.get('/events/demo/enroll', extra_environ=self.extra_environ)
        response.mustcontain('Lesson A/B', 'Lesson C/D', 'Lesson E')

        response.form.set('lesson', 1)
        response = response.form.submit(extra_environ=self.extra_environ)

        response.mustcontain('Lesson A/B', 'New Team', 'Team A', 'Team B')

        response.form.set('team', '__new__')
        response = response.form.submit(extra_environ=self.extra_environ)

        user = DBSession.merge(self.user)
        team = Team.query.filter(Team.name.like('New Team %%')).one()
        assert user in team.members
        assert team in user.teams
예제 #32
0
    def _default(self, language_id, *args, **kw):
        try:
            language_id = int(language_id)
            language = DBSession.query(Language).filter_by(
                id=language_id).one()
        except ValueError:
            flash('Invalid Language id: %s' % language_id, 'error')
            abort(400)
        except NoResultFound:
            flash('Language %d not found' % language_id, 'error')
            abort(404)
        except MultipleResultsFound:
            log.error('Database inconsistency: Language %d' % language_id,
                      exc_info=True)
            flash(
                'An error occurred while accessing Language %d' % language_id,
                'error')
            abort(500)

        return dict(page='language', language=language, languages=None)
예제 #33
0
    def test_enroll_team_new(self):
        """Enrolling for New Team"""
        demo = self.configure_event('demo', 'team_new', None)

        response = self.app.get('/events/demo/enroll',
                                extra_environ=self.extra_environ)
        response.mustcontain('Lesson A/B', 'Lesson C/D', 'Lesson E')

        response.form.set('lesson', 1)
        response = response.form.submit(extra_environ=self.extra_environ)

        response.mustcontain('Lesson A/B', 'New Team', 'Team A', 'Team B')

        response.form.set('team', '__new__')
        response = response.form.submit(extra_environ=self.extra_environ)

        user = DBSession.merge(self.user)
        team = Team.query.filter(Team.name.like('New Team %%')).one()
        assert user in team.members
        assert team in user.teams
예제 #34
0
    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'))
예제 #35
0
    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'))
예제 #36
0
    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'))
예제 #37
0
    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'))
예제 #38
0
 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))
예제 #39
0
    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')
예제 #40
0
 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))
예제 #41
0
    def enroll(self, password=None, lesson=None, team=None, *args, **kwargs):
        '''Event enrolling page'''

        params = {}

        if not self.event.enroll:
            flash('Enroll not allowed', 'error')
            return HTTPForbidden()

        if self.event.password and password != self.event.password:
            if password:
                flash('Wrong password', 'error')
            c.text = u'Please enter the password to enroll for this event:'
            c.form = PasswordEnrollForm
        else:
            if password:
                params['password'] = password

            if self.event.enroll == 'event':
                try:
                    self.event._members.append(request.user)
                    DBSession.flush()
                except SQLAlchemyError:
                    log.warn('Error while enrolling user %r for event %r:', request.user, self.event, exc_info=True)
                    flash('An error occured', 'error')
                else:
                    flash('Enrolled for Event "%s"' % self.event.name,
                        'ok')
                    redirect(self.event.url)

            if self.event.enroll in ('lesson_team', 'team', 'team_new') and team:
                if self.event.enroll == 'team_new' and team == '__new__':
                    try:
                        lesson = Lesson.query.get(int(lesson))
                    except ValueError:
                        lesson = team = None
                    else:
                        # Get unique team name
                        q = Team.query.filter_by(lesson=lesson)
                        i = q.count() + 1
                        while True:
                            name = 'New Team %d' % i
                            t = q.filter_by(name=name).first()
                            if not t:
                                break
                            i = i + 1
                        team = Team(lesson=lesson, name=name)
                        DBSession.add(team)
                else:
                    try:
                        team = Team.query.get(int(team))
                    except ValueError:
                        team = None
                if team:
                    try:
                        team.members.append(request.user)
                        DBSession.flush()
                    except SQLAlchemyError:
                        log.warn('Error while enrolling user %r for team %r:', request.user, team, exc_info=True)
                        flash('An error occured', 'error')
                        lesson = lesson.id
                    else:
                        flash('Enrolled for Team "%s" in Lesson "%s" in Event "%s"'
                                % (team.name, team.lesson.name, self.event.name),
                            'ok')
                        redirect(self.event.url)
                else:
                    flash('Selected Team does not exist', 'error')

            if self.event.enroll in ('lesson', 'lesson_team', 'team', 'team_new') and not lesson:
                c.text = u'Please select the lesson you would like to attend:'
                c.form = LessonSelectionForm(event=self.event, action=url('', params))

            if self.event.enroll == 'lesson' and lesson:
                try:
                    lesson = Lesson.query.get(int(lesson))
                except ValueError:
                    lesson = None
                if lesson:
                    try:
                        lesson._members.append(request.user)
                        DBSession.flush()
                    except SQLAlchemyError:
                        log.warn('Error while enrolling user %r for lesson %r:', request.user, lesson, exc_info=True)
                        flash('An error occured', 'error')
                    else:
                        flash('Enrolled for Lesson "%s" in Event "%s"'
                                % (lesson.name, self.event.name),
                            'ok')
                        redirect(self.event.url)
                else:
                    flash('Selected Lesson does not exist',
                        'error')

            if self.event.enroll in ('lesson_team', 'team', 'team_new') and lesson:
                try:
                    lesson = Lesson.query.get(int(lesson))
                except ValueError:
                    lesson = None
                else:
                    params['lesson'] = lesson.id
                    c.text = u'Please select the team in which you would like to work:'
                    c.form = TeamSelectionForm(
                        lesson=lesson,
                        new=bool(self.event.enroll == 'team_new'),
                        action=url('', params),
                    )

        return dict(page='events', heading=u'Enroll for %s' % self.event.name)
예제 #42
0
파일: fix.py 프로젝트: samsemilia7/SAUCE
    args = parse_args()
    load_config(args.conf_file)

    #print model.DBSession.query(model.User.user_name).all()

    events = Session.query(model.Event).all()

    print [(i, e.name) for i,e in enumerate(events)]

    event_id = raw_input('event_id: ')
    event = events[int(event_id)]

    fix_languages = raw_input("Allow all languages on all assignments? [y]")

    if fix_languages == 'y':
        l = Session.query(model.Language).all()

        for a in Session.query(model.Assignment).filter_by(event_id=event.id).all():
            a = Session.merge(a)
            a.allowed_languages=l
            Session.add(a)

        try:
            transaction.commit()
        except IntegrityError:
            print traceback.format_exc()
            transaction.abort()

    fix_visible_tests = raw_input("Fix boolean visible attribute on tests? [y]")

    if fix_visible_tests == 'y':
예제 #43
0
파일: user.py 프로젝트: Ayutac/SAUCE
 def by_user_name(cls, username):
     """Return the user object whose user name is ``username``."""
     return DBSession.query(cls).filter_by(user_name=username).first()
예제 #44
0
파일: user.py 프로젝트: Ayutac/SAUCE
 def by_email_address(cls, email):
     """Return the user object whose email address is ``email``."""
     return DBSession.query(cls).filter_by(email_address=email).first()
예제 #45
0
 def by_email_address(cls, email):
     """Return the user object whose email address is ``email``."""
     return DBSession.query(cls).filter_by(email_address=email).first()
예제 #46
0
    def _default(self, *args, **kw):
        #TODO: This filtering really needs to be rewritten!
        filters = dict(zip(args[::2], args[1::2]))
        real_filters = dict(assignment_id=set(), user_id=set())

        if self.assignment:
            real_filters['assignment_id'] = self.assignment.id
        else:
            sheet = None
            if self.sheet:
                sheet = self.sheet
            elif 'sheet' in filters:
                try:
                    s = int(filters['sheet'])
                    sheet = DBSession.query(Sheet).filter_by(event_id=self.event.id)\
                        .filter_by(sheet_id=s).one()
                except NoResultFound:
                    pass
            if sheet:
                if 'assignment' in filters:
                    try:
                        a = int(filters['assignment'])
                        a_id = DBSession.query(Assignment.id).filter_by(sheet_id=sheet.id)\
                            .filter_by(assignment_id=a).one().id
                        real_filters['assignment_id'] |= set((a_id, ))
                    except NoResultFound:
                        pass
                else:
                    real_filters['assignment_id'] |= set((a.id for a in sheet.assignments))

        if self.event:
            # Dirty, dirty hack to properly filter assignments by event
            if real_filters['assignment_id']:
                # Only allow filters by assignments from the set event
                real_filters['assignment_id'] &= set((a.id for s in self.event.sheets for a in s.assignments))
            else:
                # Simply filter by assignments for this event
                real_filters['assignment_id'] = set((a.id for s in self.event.sheets for a in s.assignments))

        if 'lesson' in filters:
            try:
                l = int(filters['lesson'])
                q1 = DBSession.query(User.id).join(lesson_members).filter_by(lesson_id=l)
                q2 = DBSession.query(User.id).join(team_members).join(Team).filter_by(lesson_id=l)
                students = q1.union(q2)
                real_filters['user_id'] |= set((s.id for s in students))
            except SQLAlchemyError:
                pass
        if 'team' in filters:
            try:
                students = DBSession.query(User.id).join(team_members)\
                    .filter_by(team_id=int(filters['team'])).join(Team)
                if self.lesson:
                    students = students.filter_by(lesson_id=self.lesson.id)
                else:
                    #students = students.filter(Team.lesson_id.in_(l.id for l in self.event.lessons))
                    students = students.join(Team.lesson).filter_by(event_id=self.event.id)
                real_filters['user_id'] |= set((s.id for s in students))
            except SQLAlchemyError:
                pass
        if 'user' in filters:
            try:
                user_id = DBSession.query(User.id).filter_by(id=int(filters['user'])).one().id
                real_filters['user_id'] |= set((user_id, ))
            except NoResultFound:
                pass

        # Cleanup filters for performancy
        definite_filters = dict()
        for (k, v) in real_filters.iteritems():
            if v:
                if isinstance(v, (list, tuple, set)) and len(v) == 1:
                    definite_filters[k] = v.pop()
                else:
                    definite_filters[k] = v

        c.table = self.table
        values = self.table_filler.get_value(filters=definite_filters)
        return dict(page='event', view=None, values=values)
예제 #47
0
 def index(self):
     languages = DBSession.query(Language)
     return dict(page='language', language=None, languages=languages)
예제 #48
0
def setup():
    """Function called by nose on module load"""
    setup_db()
    DBSession.add(
        User(id=4771, user_name='dummy', email_address='*****@*****.**'))
    DBSession.flush()
예제 #49
0
 def tearDown(self):
     """Finish model test fixture."""
     DBSession.rollback()
예제 #50
0
 def test_query_obj(self):
     """Model objects can be queried"""
     obj = DBSession.query(self.klass).one()
     for key, value in self.attrs.iteritems():
         assert_equals(getattr(obj, key), value)
예제 #51
0
파일: language.py 프로젝트: Ayutac/SAUCE
 def index(self, *args, **kwargs):
     languages = DBSession.query(Language)
     return dict(page='language', language=None, languages=languages)
예제 #52
0
def setup():
    """Function called by nose on module load"""
    setup_db()
    DBSession.add(User(id=4771, user_name='dummy', email_address='*****@*****.**'))
    DBSession.flush()
예제 #53
0
 def configure_event(self, url, enroll, password):
     event = Event.query.filter_by(_url=url).one()
     event.enroll = enroll
     event.password = password
     transaction.commit()
     return DBSession.merge(event)
예제 #54
0
 def by_user_name(cls, username):
     """Return the user object whose user name is ``username``."""
     return DBSession.query(cls).filter_by(user_name=username).first()