Giter Club home page Giter Club logo

compair's Introduction

ComPAIR

Join the chat at https://gitter.im/ubc/acj-versus

Introduction

ComPAIR is a peer review application developed by the University of British Columbia and freely available for anyone to download, install, and use. ComPAIR distinguishes itself from other peer review tools by harnessing students' innate ability to compare. Rather than have students evaluate one work at a time, ComPAIR presents paired sets of peer work for comparison-based review and feedback.

ComPAIR was inspired by Adaptive Comparative Judgement (ACJ), which is based on the law of comparative judgement conceived by L. L. Thurstone in 1927 that states human beings are better at comparing two things than evaluating one in isolation. In the application, instructors can enable a score for each answer that "adapts" to how the answer does in each comparison. The scores can then be used in generating subsequent pairs, theoretically increasing the similarity in answer quality and the challenge for students in choosing which better meets the instructor-set criteria.

Frameworks

The frontend is purely written in Javascript, using AngularJS as a MVC-framework and Bootstrap for the design. The backend uses the python web application framework Flask with Flask SQLAlchemy for database persistence. Alembic is used to maintain database updates.

Developer Installation - Docker

Development Prerequisites

For running unit tests you may also require a lapack and atlas. These are needed by the python libraries scipy and numpy to install properly. These can be installed with:

yum install lapack-devel atlas-devel

or

apt-get install libatlas-base-dev liblapack-dev

Clone Repo and Start Server

git clone [email protected]:ubc/compair.git compair
cd compair
npm install
node_modules/gulp/bin/gulp.js
node_modules/gulp/bin/gulp.js prod
docker-compose up -d

After initialization is finished, run the following command if it is the first time:

docker exec -it compair_app_1 python manage.py database create

Alternatively you can create a pre-populated database with demo data:

docker exec -it compair_app_1 python manage.py database create -s

ComPAIR is accessible at

http://localhost:8080/

Check Logs

# app
docker logs -f compair_app_1
# nginx
docker logs -f compair_web_1
# db
docker logs -f compair_db_1

Stop Server

docker-compose stop

Stop Server and Clean Up

docker-compose down
rm -rf .data

Access Database

docker exec -it compair_app_1 mysql

Upgrade Database

docker exec -it compair_app_1 alembic upgrade head

Run Management Command

docker exec -it compair_app_1 python manage.py COMMAND

Build Docker Image Locally

docker build -t ubcctlt/compair-app .

Upgrade

docker-compose down
docker pull ubcctlt/compair-app # download latest ComPAIR image
docker-compose up
docker exec -it compair_app_1 alembic upgrade head # upgrade database

Running tests

Testing Prerequisites

libxmlsec1-dev is an additional system requirement for using python3-saml. If you would like to run your tests locally, you need to install it with:

# brew
brew install libxmlsec1
# apt-get
apt-get install libxmlsec1-dev
# yum
yum install xmlsec1-devel

Python unit tests:

make testb

Alternatively, these tests may be run inside docker:

# with compair running via docker-compose, get a shell to the app service
docker-compose exec app bash
# run all the backend python tests
nosetests
# run individual tests, just use the test import path
nosetests compair.tests.api.test_assignment.AssignmentAPITests
# to make the test runner stop on the first failure, add -x
# to make the test runner capture standard out (for debug prints), add -s
# combined, this would be
nosetests -xs

To help debug sqlalchemy, you can tell sqlalchemy to log all generated statements to stderr by adding this setting to compair/settings.py:

SQLALCHEMY_ECHO = True

AngularJS spec tests:

make testf

AngularJS acceptance tests:

make testa

These tests are written using Cucumber.js, the tests are located in compair/static/test/features/.

Individual tests can be run by editing gulpfile.js. Edit the bdd gulp task:

// original line:
gulp.src(["compair/static/test/features/*.feature"])
// comment out original line and set it to a specific feature file, then run
// make testa
gulp.src(["compair/static/test/features/view_users.feature"])

Generate Production Release

Run gulp prod to generate production assets. This currently just:

  1. Combine all Bower managed javascript libraries into a single minified file.
  2. Compile and minify the less files into a single css file.
  3. Compile and minify the less files used for emails into a single css file in the static folder.
  4. Copies all Bower managed images and fonts into the static folder.
  5. Copies the pdf viewer copy and assets into the static folder.

Setting up Learning Analytics

ComPAIR uses the Experience API (xAPI) and/or Caliper for collecting learning analytics. Both requires a Learning Record Store (LRS) to use.

LRS_APP_BASE_URL Optionally set a base url to use for all statements. This is useful to help keep statement urls consistent if the url of your instance changes over time or is accessible though different routes (ex http+https or multiple sub-domains). (Uses base url of request by default)

LRS_USER_INPUT_FIELD_SIZE_LIMIT: Set the character limit on statement fields containing user input. Set this in order to prevent sending large statements to the LRS that it can't handle (default: 10,000 characters)

Restart server after making any changes to settings

Statements require an actor (currently logged in user) account information. The ComPAIR account information will be used by default unless the following settings are changed.

Actor Account settings

Use these settings to control the actor information sent to the LRS. This requires that all users in the system have a globally unique identifier and that the user has an account outside of the system. See Global Unique Identifiers for more information on configuring global unique identifers though different authorization methods.

LRS_ACTOR_ACCOUNT_USE_GLOBAL_UNIQUE_IDENTIFIER: Flag indicating if global_unique_identifier should be used for the actor identifier instead of uuid.

LRS_ACTOR_ACCOUNT_GLOBAL_UNIQUE_IDENTIFIER_HOMEPAGE: Set the actor's homepage when using global_unique_identifier.

Note: Both LRS_ACTOR_ACCOUNT_USE_GLOBAL_UNIQUE_IDENTIFIER and LRS_ACTOR_ACCOUNT_GLOBAL_UNIQUE_IDENTIFIER_HOMEPAGE need to be configured and the user must have a global_unique_identifier or else the default ComPAIR actor will be sent.

##XAPI Setup

ComPAIR currently only supports basic OAuth1 authentication connections to the LRS. Authentication can be set with either LRS_XAPI_USERNAME+LRS_XAPI_PASSWORD or LRS_XAPI_AUTH.

For development, you can set LRS_XAPI_STATEMENT_ENDPOINT to either the 'local' setting (to dump statements into the xapi_log table) or to an account on https://lrs.adlnet.gov/ for your LRS. Note that https://lrs.adlnet.gov/ is set up for testing purposes only and they can clear their data at any time (do not use in production).

Settings

XAPI_ENABLED: Set to 1 to enable collecting learning analytics (disabled by default)

LRS_XAPI_STATEMENT_ENDPOINT: Set the url LRS. Use 'local' for dumping statements into xapi_log table ('local' by default)

LRS_XAPI_USERNAME: The username for the OAuth1 account.

LRS_XAPI_PASSWORD: The password for the OAuth1 account.

LRS_XAPI_AUTH: Must be in the format Basic LRS_XAPI_USERNAME:LRS_XAPI_PASSWORD where LRS_XAPI_USERNAME:LRS_XAPI_PASSWORD has been base64 encoded.

##Caliper Setup

Settings

CALIPER_ENABLED: Set to 1 to enable collecting learning analytics (disabled by default)

LRS_CALIPER_HOST: Set the url LRS. Use 'local' for dumping statements into xapi_log table ('local' by default)

LRS_CALIPER_API_KEY: API key for sending Caliper statements to the LRS.

Setting up Background Tasks

ComPAIR has the following tasks defined under the package compair.tasks:

  • reset_demo - For demo site only. This task resets the database with default data.
  • update_lti_course_membership - updates enrollment for the course based on LTI membership
  • update_lti_course_grades and update_lti_assignment_grades - update the course grade and assingment grades respecitvely for LTI consumers
  • send_messages and send_message - send out email messages e.g. students can turn on notification for feedbacks given to their answers
  • set_passwords - (bulk) updates user passwords e.g. when importing users
  • send_lrs_statement - sends xAPI statements to Learning Record Store

By default (CELERY_TASK_ALWAYS_EAGER=1), these Celery tasks are executed locally by blocking until the task returns. To improve performance, you can configure them as background tasks to run asynchronously.

Enable tasks to run in background

To run tasks asynchronously, you need to:

  • Set up a Celery broker (e.g. Redis, RabbitMQ)
  • Set up Celery workers to run the tasks. A worker can be started by running celery --app=celery_worker.celery worker. If the work runs in a separate container or virtual machine, remember to apply the same environment variables as the ComPAIR app.
  • Set CELERY_BROKER_URL according to your broker setup
  • Set CELERY_TASK_ALWAYS_EAGER to 0 (zero). See below for details
  • To add new Celery configuration values, convert the lower case Celery setting into uppercase and prepend it with a CELERY_ prefix, and then add it to the right overrideable dict in configuration.py. E.g.: broker_url becomes CELERY_BROKER_URL. The setting will be stripped of the CELERY_ prefix and converted back to lower case via Flask Config's get_namespace() before being fed to Celery.
  • If worker memory leak is an issue, setting CELERY_WORKER_MAX_TASKS_PER_CHILD or CELERY_WORKER_MAX_MEMORY_PER_CHILD on the worker can be a workaround.

Settings

CELERY_TASK_ALWAYS_EAGER: Set to 0 to enable background tasks (1 by default).

CELERY_BROKER_URL: Set the url for the broker tool to be used (ex: redis or rabbitmq instance url)

CELERY_RESULT_BACKEND: Set the backend to store results (disabled by default)

CELERY_TIMEZONE: Set the timezone used for cron jobs. Currently only used for demo installations ('America/Vancouver' by default)

CELERY_WORKER_MAX_TASKS_PER_CHILD: Takes an int. Kills a worker process and forks a new one when it has executed the given number of tasks

CELERY_WORKER_MAX_MEMORY_PER_CHILD: Takes an int as memory in kilobytes. Kills a worker process and forks a new one when it hits the given memory usage, the currently executing task will be allowed to complete before being killed.

Restart server after making any changes to settings

User Authentication Settings

ComPAIR needs at least one of the following authentication settings so that users can log in. You can also enable multiple options at once, e.g., you can use both CAS and LTI.

APP Login Settings

APP_LOGIN_ENABLED: Enable login via username & password (default: True)

Restart server after making any changes to settings

CAS Login Settings

CAS_LOGIN_ENABLED: Enable login via CAS server (default: False)

CAS_SERVER: Url of the CAS Server (do not include trailing slash)

CAS_AUTH_PREFIX: Prefix to CAS action (default '/cas')

CAS_USE_SAML: Determines which authorization endpoint to use. '/serviceValidate' if false (default). '/samlValidate' if true.

CAS_ATTRIBUTE_USER_ROLE: CAS field will determine the user's default system role on account creation (default: none). Will only promote to instructor if there is a match against CAS_INSTRUCTOR_ROLE_VALUES. If not specified or does not match any value from CAS_INSTRUCTOR_ROLE_VALUES, the user will be given the student system role and will manually need to be promoted if needed.

CAS_INSTRUCTOR_ROLE_VALUES: List of values CAS_ATTRIBUTE_USER_ROLE can contain that would indicate the user is an instructor (default: empty set). Separate values by a space (ex: instructor teacher staff).

CAS_ATTRIBUTE_FIRST_NAME: Optionally automatically sync user's first name with the supplied CAS attribute (Will only override if attribute is present a contains content).

CAS_ATTRIBUTE_LAST_NAME: Optionally automatically sync user's last name with the supplied CAS attribute (Will only override if attribute is present a contains content).

CAS_ATTRIBUTE_STUDENT_NUMBER: Optionally automatically sync user's student number with the supplied CAS attribute (Will only override if attribute is present a contains content).

CAS_ATTRIBUTE_EMAIL: Optionally automatically sync user's email with the supplied CAS attribute (Will only override if attribute is present a contains content).

Restart server after making any changes to settings

SAML 2.0 Login Settings

SAML_LOGIN_ENABLED Enable login via SAML idp (default: False)

SAML_SETTINGS JSON Settings for python3-saml

SAML_SETTINGS_FILE File location for JSON Settings (only if SAML_SETTINGS not used)

SAML_UNIQUE_IDENTIFIER Set the attribute that uniquely identifies the user (default: 'uid')

SAML_METADATA_URL Optionally load SAML idp metadata by loading the ipd's public metadata.

SAML_METADATA_ENTITY_ID Use when loading idp metadata with multiple public entity ids.

SAML_EXPOSE_METADATA_ENDPOINT Optionally expose the /api/saml/metadata endpoint for the idp's usage (disabled by default).

SAML_ATTRIBUTE_USER_ROLE: SAML field will determine the user's default system role on account creation (default: none). Will only promote to instructor if there is a match against SAML_INSTRUCTOR_ROLE_VALUES. If not specified or does not match any value from SAML_INSTRUCTOR_ROLE_VALUES, the user will be given the student system role and will manually need to be promoted if needed.

SAML_INSTRUCTOR_ROLE_VALUES: List of values SAML_ATTRIBUTE_USER_ROLE can contain that would indicate the user is an instructor (default: empty set). Separate values by a space (ex: instructor teacher staff).

SAML_ATTRIBUTE_FIRST_NAME: Optionally automatically sync user's first name with the supplied SAML attribute (Will only override if attribute is present a contains content).

SAML_ATTRIBUTE_LAST_NAME: Optionally automatically sync user's last name with the supplied SAML attribute (Will only override if attribute is present a contains content).

SAML_ATTRIBUTE_STUDENT_NUMBER: Optionally automatically sync user's student number with the supplied SAML attribute (Will only override if attribute is present a contains content).

SAML_ATTRIBUTE_EMAIL: Optionally automatically sync user's email with the supplied SAML attribute (Will only override if attribute is present a contains content).

You must provide SAML_SETTINGS or SAML_SETTINGS_FILE to use SAML Login. See python3-saml for details on setting up the JSON settings. You can use SAML_METADATA_URL and SAML_METADATA_ENTITY_ID to fetch the idp's public metadata for very request. You can use SAML_EXPOSE_METADATA_ENDPOINT to expose public metadata for the idp.

libxmlsec1-dev is an additional system requirement for using python3-saml. If you would like to run your tests locally, you can install it with

# brew
brew install libxmlsec1
# apt-get
apt-get install libxmlsec1-dev
# yum
yum install xmlsec1-devel

Note: https://www.testshib.org is used for using saml authentication for development purposes. deploy/development/dev_saml_settings.json contains testing settings and should not be used in production. if you edit dev_saml_settings.json, you must upload it to https://www.testshib.org/register.html. Please also replace deploy/development/compair_dev_saml_metadata.xml with the metadata so it can be kept track of.

LTI Settings

LTI_LOGIN_ENABLED: Enable login via LTI consumer (default: True) The launch URL will be https://YOUR_SITE_DOMAIN/api/lti/auth

Restart server after making any changes to settings

In addition, you must create a LTI consumer key/secret by:

  • Logging into ComPAIR as a system administrator
  • Clicking on 'Manage LTI' in the header
  • Clicking 'Add LTI Consumer'
  • Entering a unique key and a hard to guess secret and clicking 'Save'

You can enable/disable consumers from the Manage LTI screen as needed

Global Unique Identifiers

Useful if your institution has globally unique identifers that are available from the different authorization methods (CAS, SAML, LTI).

Global unique identifers allow ComPAIR to:

  • Automatically linking new CAS, SAML, LTI logins to existing accounts associated with the global_unique_identifier. The user will not be prompted to login or create a new account.
  • Enhance LTI membership service/extension roster syncing by allowing new LTI accounts can be automatically linking to existing ComPAIR accounts or creating new ones (user would no longer be forced to launch an LTI link at least once from the LTI consumer).
  • Send learning records to the LRS using global_unique_identifier and a different homepage url for the actor account instead of ComPAIR uuid and the ComPAIR app url. See Actor Account settings for more information.

CAS

CAS_GLOBAL_UNIQUE_IDENTIFIER_FIELD: CAS attribute used to identify an account across third party logins and LTI. Only required when CAS is enabled.

SAML

SAML_GLOBAL_UNIQUE_IDENTIFIER_FIELD: Optional SAML attribute used to identify an account across third party logins and LTI.

LTI

System admins can manage global unique identifiers for each LTI consumer from the 'Manage LTI' screen. Setting the global_unique_identifier_param field will use that param to unique identify an account across third party logins and LTI.

Login Screen Customization

Note all html content used for login screen will be sanitized by AngularJS.

LOGIN_ADDITIONAL_INSTRUCTIONS_HTML: Set the text or HTML displayed to users beside the login prompt. By default it will display UBC specific login troubleshooting information (it is recommended to change this value). If left blank, the instruction area will not appear.

CAS_LOGIN_HTML: Set the text or HTML displayed to users for selecting to login with CAS (default will be a UBC CWL login button).

SAML_LOGIN_HTML: Set the text or HTML displayed to users for selecting to login with SAML (default will be a UBC CWL login button).

(Optional) Email Notification Settings

Run gulp prod in order to generate the combined minified css used in the html emails.

MAIL_NOTIFICATION_ENABLED: Enable email notifications application wide (default: False).

Even if notifications are enabled, users can disable them for themselves on the edit account screen.

See Flask-Mail for details on configuration settings for mailing notifications.

Disable outgoing https requirements

ENFORCE_SSL: Enforce https on all requests made though LTI and CAS (default: True)

Can be used to disable secure SSL requirements for outgoing and incoming traffic from LTI and CAS. Note that SAML https settings should be adjusted in SAML_SETTINGS or SAML_SETTINGS_FILE. This should only be used for development or staging purposes.

Setup a demo installation

Demo installations have default data of one course, 2 assignments, 1 instructor, and 30 students. Demo installations do not allow editing/deleting the course, assignments, student answers, or enrollment of any automatic generated default data. Users can still create other courses, assignments, etc and modify them as needed. Demo installations also allow anyone to create system administrators, instructors, and students at any time. If the cron job is setup, all data will be automatically reset to defaults every day at 3:00 a.m.

You should never turn a server with existing data into a demo. Always delete all existing data first with:

python manage.py database drop

Demo Settings

DEMO_INSTALLATION: Turns the ComPAIR installation into a demo (default: False)

Setting DEMO_INSTALLATION to True will also force APP_LOGIN_ENABLED to True and CAS_LOGIN_ENABLED to False. LTI_LOGIN_ENABLED may still be optionally set to True or False if you want to allow LTI connections to be made to the demo installation.

Additional Setup

In order for the cron job to work properly, you must also create an additional celery process (ex: celery -A celery_worker.celery beat). You should also set CELERY_TIMEZONE to your preferred timezone so that the automatic scheduler will reset properly at 3:00 a.m. in your timezone.

You can set the data the first time by running:

python manage.py database create

Attachments Settings

ATTACHMENT_UPLOAD_LIMIT: The file size upload limit (in bytes) for all attachments including Kaltura uploads. (default 250MB).

ATTACHMENT_ALLOWED_EXTENSIONS: List of file extensions allowed for upload (default: pdf, mp3, mp4, webm, jpg, jpeg, png). Separate values by a space (ex: pdf mp3 mp4 webm jpg jpeg png).

ATTACHMENT_PREVIEW_EXTENSIONS: List of file extensions allowed for image preview (default: jpg, jpeg, png). Must also be included in ATTACHMENT_ALLOWED_EXTENSIONS. Separate values by a space (ex: jpg jpeg png).

Restart server after making any changes to settings

(Optional) Kaltura Media Attachments

You may optionally enable Kaltura uploads to support more media file attachment types with better cross browser playback compatibility.

It is highly recommended to create a separate account for ComPAIR so it does not interfere with other content. You should have a Kaltura player setup and configured for the account.

By Default, ComPAIR treats the account provided as a bucket account to store all video/audio uploads. If global unique identifers are setup, you may alternatively allow users to control their media by turning KALTURA_USE_GLOBAL_UNIQUE_IDENTIFIER on. This requires that Kaltura user ids use the same global unique identifer.

Currently only version 3 of the Kaltura api is supported.

Settings

KALTURA_ENABLED: Set to 1 to enable uploading media attachments to a Kaltura account (off by default).

KALTURA_SERVICE_URL: The base url of the Kaltura server.

KALTURA_PARTNER_ID: The partner id of the Kaltura account.

KALTURA_SECRET: The secret for the partner id provided.

KALTURA_USER_ID: The user id (email) of the Kaltura account.

KALTURA_PLAYER_ID: A Kaltura player id (conf ui id) to display the media in.

KALTURA_VIDEO_EXTENSIONS: Set of video file extensions that will be uploaded to the Kaltura instead of ComPAIR (default: mp4, mov, and webm). Separate values by a space (ex: mp4 mov webm).

KALTURA_AUDIO_EXTENSIONS: Set of audio file extensions that will be uploaded to the Kaltura instead of ComPAIR (default: mp3). Separate values by a space (ex: mp3).

KALTURA_USE_GLOBAL_UNIQUE_IDENTIFIER: Optionally use a user's global unique identifer if available for the Kaltura upload's user_id (off by default). Doing so will allow the user to control their media with Kaltura. Note that it is possible for them to remove the media and it to no longer be available in ComPAIR for comparisons or review.

Restart server after making any changes to settings

Student Data Privacy Settings

You can control data accessibility for certain sensitive fields with the following settings

EXPOSE_EMAIL_TO_INSTRUCTOR: Set to 1 to allow instructors to see and modify email address for students in any of their classes (disabled by default). Instructors can see email info by exporting their class lists or view one of their student's profiles.

EXPOSE_THIRD_PARTY_USERNAMES_TO_INSTRUCTOR: Set to 1 to allow instructors to see CAS/SAML usernames for students in any of their classes (disabled by default). Instructors can see CAS?SAML username info by exporting their class lists

In addition you can control if students are able to edit their first name, last name, display name, and student number. System admins and instructors can still modify these profile fields. Any student disabled field for editing will be automatically updated with values from LTI or CAS/SAML on login. Please check the LTI, CAS, or SAML sections for additional environment variables that may need to be included (for example if student number is disabled, then CAS_ATTRIBUTE_STUDENT_NUMBER need to be set for automatic updated on student login)

ALLOW_STUDENT_CHANGE_NAME: Allows students to edit their first & last names (default: enabled).

ALLOW_STUDENT_CHANGE_DISPLAY_NAME: Allows students to edit their display name (default: enabled).

ALLOW_STUDENT_CHANGE_STUDENT_NUMBER: Allows students to edit their student number (default: enabled).

ALLOW_STUDENT_CHANGE_EMAIL: Allows students to edit their email address (default: enabled).

Google Analytics Web Tracking

  1. Register for a Google Analytics web property ID at http://www.google.ca/analytics/.
  2. Set GA_TRACKING_ID to your web property id (ex: 'UA-XXXX-Y')

Restart server after making any changes to settings

compair's People

Contributors

andrew-gardener avatar dependabot[bot] avatar gitter-badger avatar ionparticle avatar jleong-openedx avatar kitsook avatar kschwenghagen avatar leiseflehen avatar lenglund avatar mwytang avatar stmccartney avatar tuehoang avatar ubc-tuehoang avatar wynnset avatar xcompass 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

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

compair's Issues

Notification of responses

An option to be notified of responses when your question got answered.

This could be in the form of email but it would be much better if it was part of the nav bar on top where it'll tell you that you have new answers or comments in a question.

Don't use username as display name

Usernames might not be user read able. In UBC's case, usernames received from Connect is just a jumble of letters and numbers. This requires that a separate user readable name be used for display. The user model should store 2 additional pieces of information:

  • Display Name
  • Real Name

The real name is the user's real first and last name. The display name will be initialized to the real name. The display name is user configurable and is what all other students see when they post. Instructors or above can see a user's real name, the author area of posts will be something like:
Display Name (Real Name)

Allow instructors to enter an authoritative answer

Instructors should be able to provide an authoritative answer to questions. Meant to clear up confusion (e.g.: if the current student answers are wrong) and provide a known good point of comparison with student answers.

The authoritative answer should have these properties and options:

  • Be displayed in a distinguishable manner from student answers, say immediately below the question, highlighted somehow, etc.
  • Be exempt from judgement.
  • Can be hidden until a certain time.

Limit answer length

Another environment variable I can imagine setting up at the time of course creation is the 'maximum answer length' and / or 'maximum comment length'. I can imagine situations where instructors actively want to limit the characters available for an answer and / or comment (use in large classes where you expect to get lots of written material and to encourage 'tight' writing are just two examples). The default could be no limit. (I've just spend a happy 10 mins reading the question and answers on the biology question about why trees grow symmetrically and some of the answers --though very good -- are like essays :)

Answer sorting button is confusing.

The answer sorting toggle flips between "By Time" and "By Score". When the toggle says "By Time", the answers are actually sorted by score. When the toggle says "By Score", the answers are actually sorted by time.

The intent of the button is to tell what clicking it will do (e.g.: clicking "By Time" will sort the answers by time), the problem is that there's no way of telling what the current sorting method is. To prevent this kind of confusion, we should change the sorting toggle to show both the available sorting options and what the current sorting option is set at.

Form Validation

Make sure that user data submissions are validated both on the client side and the server side.

Comments System

Currently, all submissions to a question are treated as answers that will be judged. There should be a way to generate discussion around questions and answers in the form of comments that won't go into the judgment system.

Mail feature

We're collecting email addresses. Is there a 'mail the class' feature that can be created? Either to spawn the default mail client or just to produce a comma separated list of addresses to paste into the mail client field (ugly, I know, but might be simpler?)

Math Editor

An easy way to edit math equations. And maybe insert Greek letters for variables too.

Make math toolbar optional

The math typsetting seems to take quite a while. IS there a way to turn this off at the point of creating a course? I can imagine this being part of a set of course environment variables that instructors customize at the course setup stage.

Installer needs to be able to handle database upgrades

If the database schema has changed, there needs to be a way for it to be automatically updated. E.g.: The addition of the email field for users would break the installer if the user already has an older user table. The older user table doesn't have email so the installer dies when it tries to write an email into the database.

Tags as categories for questions

Can we have tags added to each question, that are defined at the point of creation, that are also displayed under the question title as clickable links to discover related questions?

(If that's possible, we should have a tag cloud view too?)

Download participation data

Whilst an awful lot of the instructor functionality will become a bit clearer once we find a place to pilot this (ie real course, real instructor) it would be good to have some sense of what they would want to be able to do. I think the most important thing would be to be able to download participation data for each student in a csv format that could be used as the basis for grading.

LTI Integration

Allow single sign on, course creation, course enrolment sync, using the LTI standard.

Things I'm not sure about or don't know what they mean

  • I would not have the 'Show answer' option that allows people to see the author's answer before answering it themselves
  • Likewise, I would not have the judge answers option available until a student has answered a question.
    • I would simply have one button per Q ("Submit your answer')
    • Once a student has answered, I would show them the author's explanation and then invite them to do one of three things
    • Judge other answers
    • Add comments
  • Do we need a third option of 'I just can't judge this pair'? I wouldn't suggest this be as prominent as the Left or Right options but I have already come across wanting to have this option for some of the Physics questions. There may be problems / issues / errors in both explanations that we want to a judger to be able to record a neutral response to. I would suggest such an option does not increment the score for either question, but it simply spins up another pair to judge.

User profile editor

As a user
I want to be able to change my display name and email
So that I can pretend to be someone else

User reference using uid

Question, Script, CommentA CommentQ tables refer to User using author.
Modify them so that they refer to User using uid instead.

Generate breadcrumbs dynamically

Breadcrumbs are currently hard coded into each page. If we need to change it, it's very unwieldy, there should be a way to easily construct the breadcrumb on each page dynamically.

The way of enrolling users should be changed

Right now, the enrol user page listed all users in the system. It may not be efficient when the system has large amount users. The loading of the page will be very slow.

The enrolled user list and the function of the enrolling user should be separate. The pagination should only fetch the users listed on current page, instead of all users.

Insert math formulas from toolbar at cursor

Currently the math formulas are being inserted at the beginning of the text instead of at the cursor. It would be nice to have the math formula insert where the cursor is.

Export of questions etc.

Also, I can imagine that people would want to export a question (or series of questions), plus ranked answers, plus comments to use in some context outside the system.

Comments for Judgement

It may be useful information for the instructor to see why a student decides to choose one answer over another.

Allow instructors to mark approval/disapproval for answer ranking and/or questions.

If the instructor finds that students have created poor quality questions or unwittingly ranked low quality answers as high, they should have a mechanism to indicate their disapproval. Conversely, they should also have a way of indicating approval for high quality questions/answers.

This could also be a good way for students to easily sort out high quality/high effort questions/answers.

Allow uploading images

The ability to upload images to questions, answers and comments would be really useful.

Participation marks

Should be able to get some stats on student participation so instructors can grade students on participation.

Add functionality to question page for instructor

Rather than functionality that looks like the student view, it would be good to have some basic analytic functions here for instructors. Such as:

  • Participation snapshots (over time, as a percentage of class)
  • Number of questions, answers, judgements, comments etc made in certain time window (24h, 48h, 5d, 7d, 30d, custom?)

Handling long course name

Right now, if the course name is very long, the server will return 500/502 with an exception.

sqlalchemy.exc.IntegrityError: (IntegrityError) (1062, "Duplicate entry 'This is a super long name course title I wonder how this is disp' for key 'name'") 'INSERT INTO `Course` (name) VALUES (%s)' ('This is a super long name course title I wonder how this is displayed This is a super long name course title I wonder how this is displayed1',)

System should handle long course name. If there is a limitation, the limitation should be posted on the course creating page and the limitation shouldn't be too small.

Delete a course

Instructor/Admin should be able to delete a course. Before course is being deleted, warn the user that the action is irreversible. Then delete the course and related records.

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.