Giter Club home page Giter Club logo

sauce's Introduction

DEPRECATED

The SAUCE project in its current form (as it exists in this repository) is deprecated and unmaintained.

No Maintenance Intended

image

SAUCE - System for AUtomated Code Evaluation

A language-independent, web-based automated assessment tool for programming assignments in practical programming courses within academic environments like universities and schools.

This software project is licensed under the GNU Affero General Public License, Version 3 (AGPL-3.0). You find a copy of that license in the file LICENSE.txt.

Build Status

Branch Build Status Test Coverage Code Health
master Build Status - master branch Test Coverage - master branch Coverage - master branch Code Health - master branch
develop Build Status - develop branch Test Coverage - develop branch Coverage - develop branch Code Health - develop branch

Installation

For installation instructions, see INSTALL.rst.

Demo instance

If you want to try out SAUCE without setting up your own instance, you can access the demo instance at https://sauce-moschlar.herokuapp.com/.

Every newly set up instance has some dummy data which includes several users and a sample event called Programming 101 - Demo.

You can log in for different user roles using the following credentials:

Role Username Password What's special to see with this role?
Teacher (responsible for an event - creating sheets, assignments, tests, lessons, tutors, students, etc.) teacher1, (teacher2) teachpass The event administration page at /events/demo/admin and the lesson submission page at /events/demo/lessons/1/submissions and the judgement pages for the submissions.
Tutor (responsible for a single lesson of an event) tutor1, (tutor2) tutorpass The lesson submission page at /events/demo/lessons/2/submissions and the judgement pages for the submissions. Also, the similarity page for an assignment would be very interesting.
Various Students in different teams and lessons and events studenta1, studenta2, studenta3, studentb1, studentb2, studentc1, studentc2, studentd1, studentd2, studentd3, studente1 studentpass The user profile page, where you can see your own and your team members' submissions at /user

sauce's People

Contributors

moschlar avatar samsemilia7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

sauce's Issues

Grace period for submitting over time

Allow students to submit submissions even if end_time of the event/assignment is reached.
This enables teachers to accept submissions (probably with some scoring penalty) in any case and it can lessen the impact of technical difficulties on heavy-duty submission times.

But it should be made sure that the last state of in-time submission is saved before the over-time submission is saved and the teacher get's to see a warning and the possibility to browse this kind of history.

Static pages on /

Static pages that need to be written with meaningful content:

  • Index page
  • Contact page
  • Help page
  • About page

Source Code fullscreen view

In Addition to downloading the source code it would be nice to display it highlighted on a whole page without any other UI elements.

Tests have to return more information

For educational purposes, tests have to be fail-suppressing (e.g. leave non-parsed chunks as they are) and need to return much more information about failures that occurred.
We could cumulate exceptions from parsing and store them. Then we can display educational hints based on the types of exceptions that happened.

Umlauts break submission page

When using umlauts in a submission or uploading an utf-8 file, SAUCE gets broken.

Module weberror.errormiddleware:162 in __call__
>>  app_iter = self.application(environ, sr_checker)
Module tg.configuration:877 in remover
>>  return app(environ, start_response)
Module repoze.tm:24 in __call__
>>  result = self.application(environ, save_status_and_headers)
Module repoze.who.middleware:107 in __call__
>>  app_iter = app(environ, wrapper.wrap_start_response)
Module tw.core.middleware:46 in __call__
>>  return self.wsgi_app(environ, start_response)
Module tw.core.middleware:72 in wsgi_app
>>  resp = req.get_response(self.application)
Module webob.request:1053 in get_response
>>  application, catch_exc_info=False)
Module webob.request:1022 in call_application
>>  app_iter = application(self.environ, start_response)
Module tw.core.resource_injector:70 in _injector
>>  resp = req.get_response(app)
Module webob.request:1053 in get_response
>>  application, catch_exc_info=False)
Module webob.request:1022 in call_application
>>  app_iter = application(self.environ, start_response)
Module beaker.middleware:73 in __call__
>>  return self.app(environ, start_response)
Module beaker.middleware:152 in __call__
>>  return self.wrap_app(environ, session_start_response)
Module routes.middleware:131 in __call__
>>  response = self.app(environ, start_response)
Module pylons.wsgiapp:107 in __call__
>>  response = self.dispatch(controller, environ, start_response)
Module pylons.wsgiapp:312 in dispatch
>>  return controller(environ, start_response)
Module sauce.lib.base:61 in __call__
>>  return TGController.__call__(self, environ, start_response)
Module pylons.controllers.core:211 in __call__
>>  response = self._dispatch_call()
Module pylons.controllers.core:162 in _dispatch_call
>>  response = self._inspect_call(func)
Module pylons.controllers.core:105 in _inspect_call
>>  result = self._perform_call(func, args)
Module tg.controllers.dispatcher:258 in _perform_call
>>  r = self._call(func, params, remainder=remainder)
Module tg.controllers.decoratedcontroller:120 in _call
>>  output = controller_callable(*remainder, **dict(params))
Module sauce.controllers.submissions:289 in edit
>>  (compilation, testruns, submitted, result) = self.submission.run_tests(submit)
Module sauce.model.submission:65 in run_tests
>>  with Runner(self) as r:
Module sauce.lib.runner:233 in __init__
>>  srcfd.write(submission.source)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xdf' in position 237: ordinal not in range(128)

and

Module weberror.errormiddleware:162 in __call__
>>  app_iter = self.application(environ, sr_checker)
Module tg.configuration:877 in remover
>>  return app(environ, start_response)
Module repoze.tm:24 in __call__
>>  result = self.application(environ, save_status_and_headers)
Module repoze.who.middleware:107 in __call__
>>  app_iter = app(environ, wrapper.wrap_start_response)
Module tw.core.middleware:46 in __call__
>>  return self.wsgi_app(environ, start_response)
Module tw.core.middleware:72 in wsgi_app
>>  resp = req.get_response(self.application)
Module webob.request:1053 in get_response
>>  application, catch_exc_info=False)
Module webob.request:1022 in call_application
>>  app_iter = application(self.environ, start_response)
Module tw.core.resource_injector:70 in _injector
>>  resp = req.get_response(app)
Module webob.request:1053 in get_response
>>  application, catch_exc_info=False)
Module webob.request:1022 in call_application
>>  app_iter = application(self.environ, start_response)
Module beaker.middleware:73 in __call__
>>  return self.app(environ, start_response)
Module beaker.middleware:152 in __call__
>>  return self.wrap_app(environ, session_start_response)
Module routes.middleware:131 in __call__
>>  response = self.app(environ, start_response)
Module pylons.wsgiapp:107 in __call__
>>  response = self.dispatch(controller, environ, start_response)
Module pylons.wsgiapp:312 in dispatch
>>  return controller(environ, start_response)
Module sauce.lib.base:61 in __call__
>>  return TGController.__call__(self, environ, start_response)
Module pylons.controllers.core:211 in __call__
>>  response = self._dispatch_call()
Module pylons.controllers.core:162 in _dispatch_call
>>  response = self._inspect_call(func)
Module pylons.controllers.core:105 in _inspect_call
>>  result = self._perform_call(func, args)
Module tg.controllers.dispatcher:258 in _perform_call
>>  r = self._call(func, params, remainder=remainder)
Module tg.controllers.decoratedcontroller:142 in _call
>>  response = self._render_response(controller, output)
Module tg.controllers.decoratedcontroller:331 in _render_response
>>  **render_params)
Module tg.render:188 in render
>>  kwargs['result'] = render_function(template_name, tg_vars, **kwargs)
Module tg.render:428 in render_mako
>>  cache_type=cache_type, cache_expire=cache_expire)
Module tg.render:253 in cached_template
>>  return render_func()
Module tg.render:425 in render_template
>>  return literal(template.render_unicode(**globs))
Module mako.template:406 in render_unicode
>>  as_unicode=True)
Module mako.runtime:764 in _render
>>  **_kwargs_for_callable(callable_, data))
Module mako.runtime:796 in _render_context
>>  _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
Module mako.runtime:822 in _exec_template
>>  callable_(context, *args, **kwargs)
Module _home_paster_tg2env_SAUCE_sauce_templates_master_mak:100 in render_body
>>  __M_writer(escape(self.body()))
Module _home_paster_tg2env_SAUCE_sauce_templates_submission_edit_mak:71 in render_body
>>  __M_writer(c.form(c.options, child_args=c.child_args) )
Module tw.core.base:544 in __call__
>>  return self.display(value, **kw)
Module tw.core.base:541 in display
>>  return super(Widget, self).display(**kw)
Module tw.core.view:243 in display
>>  return tw.framework.engines.display(self, **kw)
Module tw.core.view:36 in _renderer
>>  output = renderer(info=kw, template=template)
Module tw.core.view:160 in _render_xhtml
>>  return engine.render(**kw)
Module mako.ext.turbogears:56 in render
>>  return template.render(**info)
Module mako.template:397 in render
>>  return runtime._render(self, self.callable_, args, data)
Module mako.runtime:764 in _render
>>  **_kwargs_for_callable(callable_, data))
Module mako.runtime:796 in _render_context
>>  _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
Module mako.runtime:822 in _exec_template
>>  callable_(context, *args, **kwargs)
Module _tw_forms_templates_table_form_mak:141 in render_body
Module tw.core.base:541 in display
>>  return super(Widget, self).display(**kw)
Module tw.core.view:243 in display
>>  return tw.framework.engines.display(self, **kw)
Module tw.core.view:36 in _renderer
>>  output = renderer(info=kw, template=template)
Module tw.core.view:160 in _render_xhtml
>>  return engine.render(**kw)
Module mako.ext.turbogears:56 in render
>>  return template.render(**info)
Module mako.template:397 in render
>>  return runtime._render(self, self.callable_, args, data)
Module mako.runtime:764 in _render
>>  **_kwargs_for_callable(callable_, data))
Module mako.runtime:796 in _render_context
>>  _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
Module mako.runtime:822 in _exec_template
>>  callable_(context, *args, **kwargs)
Module _tw_forms_templates_textarea_mak:46 in render_body
Module tw.core.mako_util:37 in content
>>  return escape(unicode(value))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 228: ordinal not in range(128)

Unicode everywhere

ATM, especially the model uses String and Text data types in text columns.

The application shall use unicode strings everywhere.

SubmissionController and submitting authorization and timeframe validity

A Teacher should always be able to test Submissions, regardless of activeness of Assignment.

SubmissionController flash messages must be more senseful and sometimes ignorable.
E.g. don't warn the teacher for his own submissions.

SubmissionWidget Submit button should be clickable with a javascript alert if tests not successful.

General navigation overhaul

Navigation has to be reworked again, since the CrudRestController stuff uses an own menu implementation on the left side.

Use only top-level objects in templates

Currently, template code may contain something like

% if submission.assignment.sheet.event:
  ${submission.assignment.sheet.event}
% endif

I think it would be more appropriate to pass all needed top-level elements (at least in the main template, not necessarily in the included functions or master template) from the controller to perform all consistency checking there.
Then the template would only have to check

% if event:

Fix test suite

Due to some problems with sqlalchemy.url = sqlite:///:memory:, the test suite is mostly broken atm.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.