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)
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'))
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)
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)
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
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')
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')
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')
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'))
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'))
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')
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')