Ejemplo n.º 1
0
    def index(self, page=1):
        '''Assignment detail page'''

        if request.user:
            submissions = set(
                Submission.by_assignment_and_user(self.assignment,
                                                  request.user).all())
            #submissions = Page(submissions, page=page, items_per_page=10)
            if getattr(request.user, 'teams', False):
                #TODO: Ugly.
                teams = set()
                for lesson in self.assignment.sheet.event.lessons:
                    teams |= set(lesson.teams)
                teams &= set(request.user.teams)
                for member in (member for team in teams
                               for member in team.students):
                    submissions |= set(
                        Submission.by_assignment_and_user(
                            self.assignment, member).all())
            submissions = sorted(list(submissions), key=lambda s: s.modified)
        else:
            submissions = []

        return dict(page='assignments',
                    event=self.event,
                    assignment=self.assignment,
                    submissions=submissions)
Ejemplo n.º 2
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'))
Ejemplo n.º 3
0
    def index(self, page=1):
        '''Assignment detail page'''

        if request.user:
            submissions = set(Submission.by_assignment_and_user(self.assignment, request.user).all())
            #submissions = Page(submissions, page=page, items_per_page=10)
            if getattr(request.user, 'teams', False):
                #TODO: Ugly.
                teams = set()
                for lesson in self.assignment.sheet.event.lessons:
                    teams |= set(lesson.teams)
                teams &= set(request.user.teams)
                for member in (member for team in teams for member in team.students):
                    submissions |= set(Submission.by_assignment_and_user(self.assignment, member).all())
            submissions = sorted(list(submissions), key=lambda s: s.modified)
        else:
            submissions = []

        return dict(page='assignments', event=self.event, assignment=self.assignment, submissions=submissions)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
 def test_submission_full_source(self):
     a = Assignment(
         id=13,
         sheet_id=42,
         assignment_id=1337,
         submission_scaffold_head=u'HEAD',
         submission_scaffold_foot=u'FOOT',
     )
     s = Submission(
         id=4711,
         assignment=a,
         source=u'BODY',
     )
     assert s.full_source == u'HEAD\nBODY\nFOOT\n', s.full_source
Ejemplo n.º 6
0
    def test_run_python(self):
        '''Test runner with a python submission'''

        self.sp = Submission(id=2,
                             assignment=self.a,
                             language=self.lp,
                             user=self.s)
        self.sp.source = r'''
print "Hello World!"
'''

        with Runner(self.sp) as r:
            compilation = r.compile()
            self.assertFalse(compilation, 'Python compilation failed')
            if not compilation or compilation.result:
                testruns = [testrun for testrun in r.test()]
                for testrun in testruns:
                    self.assertTrue(testrun.result, 'Python testrun failed')
Ejemplo n.º 7
0
    def test_run_fail(self):
        '''Test runner with a incorrect output'''

        self.sf = Submission(id=3,
                             assignment=self.a,
                             language=self.lp,
                             user=self.s)
        self.sf.source = r'''
print "Hello!"
'''

        with Runner(self.sf) as r:
            compilation = r.compile()
            self.assertFalse(compilation, 'Wrong compilation failed')
            if not compilation or compilation.result:
                testruns = [testrun for testrun in r.test()]
                for testrun in testruns:
                    print testrun
                    self.assertFalse(testrun.result, 'Wrong testrun failed')
Ejemplo n.º 8
0
    def test_run_timeout(self):
        '''Test runner with an always reached timeout value'''

        self.st = Submission(id=4,
                             assignment=self.a,
                             language=self.lp,
                             user=self.s)
        self.st.source = r'''
import time
time.sleep(2)
print "Hello World!"
'''

        with Runner(self.st) as r:
            compilation = r.compile()
            self.assertFalse(compilation, 'Timeout compilation failed')
            if not compilation or compilation.result:
                testruns = [testrun for testrun in r.test()]
                for testrun in testruns:
                    print testrun
                    self.assertFalse(testrun.result, 'Timeout testrun failed')
Ejemplo n.º 9
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'))
Ejemplo n.º 10
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'))
Ejemplo n.º 11
0
    def test_run_c(self):
        '''Test runner with a C submission'''

        self.sc = Submission(id=1,
                             assignment=self.a,
                             language=self.lc,
                             user=self.s)
        self.sc.source = r'''
#include <stdio.h>

int main(void) {
    printf("Hello World!\n");
    return 0;
}
'''

        with Runner(self.sc) as r:
            compilation = r.compile()
            self.assertTrue(compilation, 'C compilation failed')
            self.assertTrue(compilation.result, 'C compilation failed')
            if not compilation or compilation.result:
                testruns = [testrun for testrun in r.test()]
                for testrun in testruns:
                    self.assertTrue(testrun.result, 'C testrun failed')
Ejemplo n.º 12
0
    def test_run_java(self):
        '''Test runner with java submission'''

        self.sj = Submission(id=5,
                             assignment=self.a,
                             language=self.lj,
                             user=self.s)
        self.sj.source = r'''
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
'''
        self.sj.filename = 'Hello.java'

        with Runner(self.sj) as r:
            compilation = r.compile()
            self.assertTrue(compilation, 'Java compilation failed')
            self.assertTrue(compilation.result, 'Java compilation failed')
            if not compilation or compilation.result:
                testruns = [testrun for testrun in r.test()]
                for testrun in testruns:
                    self.assertTrue(testrun.result, 'Java testrun failed')