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')
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 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')
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 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)
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, )
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
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'))
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 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'))
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)
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 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')
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 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'))
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))
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')
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))
def tearDown(self): """Finish model test fixture.""" DBSession.rollback()