Coder Social home page Coder Social logo

prairielearn / prairielearn Goto Github PK

View Code? Open in Web Editor NEW
336.0 17.0 307.0 137.4 MB

Online problem-driving learning system

Home Page: http://prairielearn.readthedocs.io/

License: Other

JavaScript 16.61% HTML 6.75% Python 17.41% CSS 0.43% PLpgSQL 3.93% Shell 0.65% R 0.33% Dockerfile 0.27% C 0.17% Jupyter Notebook 2.70% Java 0.25% Makefile 0.03% Mustache 1.92% EJS 6.33% C++ 0.04% TypeScript 42.17%
assessment autograders

prairielearn's People

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  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  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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

prairielearn's Issues

Think about names

The names we have for various objects may not be very good. For example:

  • "test" could be called "assessment" or something more generic.
  • "qInstance" could be called "questionInst" so that it is more obvious what it is, and so that it won't conflict with future instance-types that also start with the letter "q". Also rename "tInstance" to "testInst".
  • Rename userData/testData in tests to tInstance/test.

Score CSV and full JSON export

Add an interface to the client to GET /export.csv and create a similar export.json endpoint. The main question here is how to handle authentication. The link needs to include auth information in the request headers, so it needs to be generated by javascript, but it then needs to trigger a download/file-save in the browser.

Better client-side error handling

Make sure app.js can survive and accurately report:

  • Load errors for all AJAX requests.
  • Parse errors for client.js from questions.
  • Exceptions thrown from question code.
  • Errors and exceptions from dependent require.js loads.

Should we shift code for tests into the client?

At the moment all code and HTML associated with a specific test is dynamically loaded, but perhaps this should just be hard-coded in the client, given that we don't really have all that many different types of tests?

Server open-files issue

At the moment the server runs out of open files after some amount of time. This can be mitigated by increasing the open-file-handle limits and periodically restarting the server, but we should see whether we can also force long-standing connections to be terminated more quickly.

Ensure UID is lowercase

Apparently NetID can be passed through from shibboleth as mixed case, so sometimes students have multiple UIDs (one lowercase, one uppercase, for example).

Remove unused code

Remove:

  • qScores
  • "Question" tab on client
  • "Debug" tab on client
  • "About" tab on client

Add fine-grained roles

  • Owner: Can do anything, up to and including deleting the course.
  • Editor: Can do anything except delete the course or change owner roles. Can create and edit all data.
  • Assistant: Can view everything, including all student data.
  • Student: Can only view their own information.

Exam ordering is wrong after grading

Clicking "New attempt at this exam", then doing a question, then grading, then clicking "Exams" in the navbar, gives a list of exam attempts with the new exam at the bottom, not at the top where it should be.

Add better instructor statistics

Instructors need to be able to easily access aggregate statistics, such as student score distributions on each homework, completion percentages for assessment items, etc. This should probably be done by "tests", as it is rather test-specific. We should probably also expose as much of this as possible to students, or at least allow this on a course-by-course basis.

Enable a hosted platform experience

Set up a hosted experience so that PrairieLearn can be used without having to set up dev and deployment instances for every class. This depends on:

  • 10 Add courses as a concept.

  • 11 Allow online editing of data.

  • Actually setting up a hosted instance, perhaps at prairielearn.engr.illinois.edu or prairielearn.illinois.edu or similar.

Always reload question modules when in dev mode

The server should always reload question modules when running in dev mode. This can be done by deleting the appropriate keys from require.cache just before doing require() on the question module.

Clean up templating

At present we use too many different templating and data-binding engines: underscore, rivets, mustache (often all applied). Reduce this to just one (mustache?).

parse fractions in numeric answers

Students seem to expect that they can enter numeric answers in the form "3/2" instead of "1.5". This is probably due to familiarity with WebAssign (used for math classes at UIUC), which can accept this. We should probably change things to handle this.

Better server-side question-error handling

Make sure server.js can survive and accurately report:

  1. Missing server.js for questions.
  2. Load/parse errors for server.js.
  3. Exceptions thrown from server.js functions.
  4. Invalid responses from server.js functions (extra data, missing data, mal-typed or mal-formed data (e.g., score < 0 or > 1)).
  5. Errors from dependent loads via r.js.

This was partially implemented in c3876b1bfa058afe65d3c23afcdc202419f69871 in old-PrairieLearn (at least the main server should survive question server errors).

Use node-subprocess to isolate instructor-written server code

We should spawn helper node subprocesses and use them to run any instructor-written code (question and test server.js code). This would allow:

  • Robustness to arbitrary errors in code.
  • Protection of global state.
  • Implementation of timeouts.

We should also do a better job of cleaning up data coming back from instructor-written code. For example, score should be forced to be a Number between 0 and 1.

What is the testing story?

Should each question include set of test data so we can run automatic tests against the full system, or at least part of the system?

Client performance improvements

  • Don't reload whole page on link-clicks and other navigation.
  • Don't serialize the loading of API data.
  • Pre-filter /users by UID for non-superusers.

server.js has incorrect async error handling

As an example:

var autoCreateTInstances = function(req, res, tInstances, autoCreateCallback) {
    var tiDB = _(tInstances).groupBy("tid");
    async.each(_(testDB).values(), function(test, callback) {
    ...
                    writeTInstance(req, res, tInstance, function() {
                        tiDB[tInstance.tid] = [tInstance];
                        callback(null);
                    });
    ...
    }, function(err) {
        if (err)
            return sendError(res, 500, "Error autoCreating tInstances", err);
        var tInstances = _.chain(tiDB).values().flatten(true).value();
        autoCreateCallback(tInstances);
    });
};

The problem occurs when two of the calls to writeTInstance() fail. Each failing writeTInstance() calls sendError(), and the second call to sendError() dies with:

Error: Can't set headers after they are sent.

We need to either be smarter inside sendError() and not try and send a second error for the same request, or don't try and do error handling inside async loops, and instead pass all errors back up to the top call-site (probably the app.get() handler) and only call sendError() once.

See http://stackoverflow.com/questions/7042340/node-js-error-cant-set-headers-after-they-are-sent

Add online editing of all data

Add a web interface allowing online editing of questions, tests, etc. This could be done by shifting question/test code into the DB, or by just directly editing the on-disk files.

Add interface links from questions back to tests

Students frequently requested being able to find out how a given practice exam question mapped back to the homework question numbering. In general this is a problem when we re-use questions and users want to be able to see the back-mappings to tests from questions.

Add anticorrelation to randomization

The PrairieRandom functions should all anti-correlate their return values, probably using stratified sampling. This will require VIDs to be generated incrementally, rather than completely randomly, for repeats of a given question.

Make question server code more general

Don't pass params to server.gradeAnswer() for questions. Instead have a question class that implements this, or other things like automating the getData() pattern.

Add related resources information to questions

Add a field for "related resources" in the info.json for each question and display it somewhere on the question page (presumably in the sidebar).

Eventually this should augmented by recommendation-engine-generated resources and click-throughs should be tracked.

Improve client error reporting and connectivity monitoring

Add a global handler for timeouts and errors on data load (JS, images, other files) and add a generic "retry" interface to the client. This should involve both automatic and manual retries, with generic user feedback (e.g., an error div at the top of the page).

Inherit availDate/dueDate in tests

At the moment we store dueDate per-test, but availDate per tInstance. These should always be store in tests, but with optional overrides in tInstances. All code should try and get the any date from the tInstance and then fallback to the test. This would allow us to update the dates for all students any time we want by changing the values in the test, but also permit per-student overrides when necessary.

Maintain persistent QIIDs for HW tests

Store current QIIDs in HW test and don't generate a new qInstance until the old one has been solved. One way to implement this would be to pass off more responsibilities to the test server code (including passing in an object that can make qInstances).

Add "courses" as a concept

Add the concept of a "course" to the system, with a CID (course ID). Courses should contain lists of users, questions, and tests. On the client side there should be a "currently active course" concept, and the server API should be augmented to take a CID parameter to operations like GET on all questions or tests, so that we just get the appropriate tests and questions.

Add answer box for questions

Add a separate div for questions to use as a "Answer Box" to display the true answer after grading is complete.

Fix "effective user" mode

There is currently code to differentiate the "effective user" from the "authenticated user", just like the unix notion of UID/EUID. This allows instructors to act as if they were a particular student, which is an easy way to see user scores, etc, without adding a special instructor view of information that a student can already see about themselves. We need to fix:

  • EUID is currently reset on some page-loads and is generally a bit flakey. This needs to be fixed.
  • We need a better interface for switching EUID for instructors, that should work for both large and small courses.

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.