Code Monkey home page Code Monkey logo

markus's Introduction

MarkUs logo

Welcome to MarkUs! Online Marking Made Easy

MarkUs is a Ruby on Rails and React web application for the submission and grading of student assignments. The primary purpose of MarkUs is to provide TAs with simple tools that will help them to give high quality feedback to students. MarkUs also provides a straight-forward interface for students to submit their work, form groups, and receive feedback. The administrative interface allows instructors to manage groups, organize the grading, and release grades to students.

1. Features

  • Student files are stored using git
  • Students submit files through the web interface or using version control
  • Graders can easily annotate students' code
  • Instructors can form groups or students can form groups on their own
  • Web-based course administration
  • See the Wiki pages for more features

2. Installation

To install MarkUs for production, see the Installation Guide for details and step by step instructions.

To install MarkUs for development, see either of the docker installation or vagrant installation guides.

3. Who is Using MarkUs?

  • Department of Computer Science, University of Toronto, Canada
  • School of Computer Science, University of Waterloo, Canada
  • École Centrale de Nantes, France

4. Credits

MarkUs grew out of OLM, which was built using the TurboGears framework. We are grateful to everyone who worked on or funded both projects, and to the creators of Ruby on Rails for building such a great framework. Since 2008, more than 140 undergraduate students have participated in the development of MarkUs; some as full-time summer interns, but most working part time on MarkUs as a project course or on a volunteer basis.

MarkUs' development has been supported by the University of Toronto, École Centrale de Nantes, et. al. Kudos to everyone who turned that support into working code, which you can see in our Contributors list

Supervisors: Karen Reid, David Liu

Former supervisors: Morgan Magnin, Benjamin Vialle

The web interface uses Font Awesome Free icons, licensed under the CC BY 4.0 license.

Fonts used are Open Sans and OpenSansEmoji.

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

markus's Issues

ensure_config_helper_test.rb fails

There is a test failure due to commit 9c3df4d
No exception is raised anymore since authenticators (i.e. external programs) may write something to stderr regardless of the fact if it's executable or not. We simply need to update the test.

System allows to add more than 1 member even if Group Properties of an assignment is set upto 1 people in a group

Step: 1.Create an Assignment with Group Limit :1 2.Select Groups and Graders 3. Try adding more than 1 member Result: System don't warns the user about Group Limit.

Test Environment:Firefox browser URL: http://www.markusproject.org/markus-test/ logged in as an Instructor.

Modified by reid 1 year ago:
Might want to generate a warning, but we still want to all the instructor to violate the group properties.

No way to delete Assignments

There doesn't seem to be a way to delete Assignments in the UI. This is pretty low priority, but probably necessary.

Provide documentation / links on how to use SVN to check out the code

The project page, and all installation documentation assumes that developers know how to use Subversion. This is not always the case - especially when novice developers come on board.

It might be a good idea to include some documentation on how to check out the code - for Linux, Windows, and Mac.

Rubric YAML upload, need better error messages

If a user tries to upload a rubric file in YAML and it has bad syntax, the error message displayed is not very user friendly. Right now it just displays the chunk of bad yaml. I couldn't figure out a (good) way to display these error messages.

Rubric YAML upload, need better error messages

g6mandi :

If a user tries to upload a rubric file in YAML and it has bad syntax, the error message displayed is not very user friendly. Right now it just displays the chunk of bad yaml. I couldn't figure out a (good) way to display these error messages.

syntax highlighting bug

Trying to load a file in the grader view we get the error message: "Could not render this file in the code viewer. Click on the Download button to download this file instead."

After clicking OK, we get the message "redundant UTF-8 sequence" and the Loading Code... wheel continue to show.

Clicking on Download leads to the trace given below.

Checking out the file through svn and checking the file type shows "ISO-8859 English text, with CRLF line terminators" There are non-ASCII characters in the file.

ActiveRecord::RecordNotFound in ResultsController#download

Couldn't find SubmissionFile without an ID

RAILS_ROOT: /data/markus/instance/csc108-2009-09 Application Trace | Framework Trace | Full Trace

/u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:1567:in find_from_ids' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:616:infind' /data/markus/instance/csc108-2009-09/app/controllers/results_controller.rb:116:in `download'

/u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:1567:in find_from_ids' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:616:infind' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:1331:in send' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:1331:inperform_action_without_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/filters.rb:617:in call_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-
2.3.4/lib/action_controller/filters.rb:610:inperform_action_without_benchmark' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue' /u/drprj/.gem/ruby/1.8/gems/activesupport-2.3.4/lib/active_support/core_ext/benchmark.rb:17:inms' /usr/lib/ruby/1.8/benchmark.rb:308:in realtime' /u/drprj/.gem/ruby/1.8/gems/activesupport-2.3.4/lib/active_support/core_ext/benchmark.rb:17:inms' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/rescue.rb:160:inperform_action_without_flash' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/flash.rb:146:in perform_action' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:532:insend' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:532:in process_without_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/filters.rb:606:inprocess' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:391:in process' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:386:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/routing/route_set.rb:437:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:87:indispatch' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:121:in _call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:130:inbuild_middleware_stack' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/head.rb:9:in call' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/head.rb:9:incall' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/methodoverride.rb:24:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/params_parser.rb:15:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/session/abstract_store.rb:122:in call' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/query_cache.rb:29:incall' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in cache' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/query_cache.rb:9:incache' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/query_cache.rb:28:in call' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/failsafe.rb:26:in call' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/lock.rb:11:incall' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/lock.rb:11:in synchronize' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/lock.rb:11:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-
2.3.4/lib/action_controller/dispatcher.rb:106:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/cgi_process.rb:44:indispatch_cgi' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:101:in dispatch_cgi' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:27:indispatch' /usr/lib/ruby/1.8/mongrel/rails.rb:76:in process' /usr/lib/ruby/1.8/mongrel/rails.rb:74:insynchronize' /usr/lib/ruby/1.8/mongrel/rails.rb:74:in process' /usr/lib/ruby/1.8/mongrel.rb:159:inprocess_client' /usr/lib/ruby/1.8/mongrel.rb:158:in each' /usr/lib/ruby/1.8/mongrel.rb:158:inprocess_client' /usr/lib/ruby/1.8/mongrel.rb:285:in run' /usr/lib/ruby/1.8/mongrel.rb:285:ininitialize' /usr/lib/ruby/1.8/mongrel.rb:285:in new' /usr/lib/ruby/1.8/mongrel.rb:285:inrun' /usr/lib/ruby/1.8/mongrel.rb:268:in initialize' /usr/lib/ruby/1.8/mongrel.rb:268:innew' /usr/lib/ruby/1.8/mongrel.rb:268:in run' /usr/lib/ruby/1.8/mongrel/configurator.rb:282:inrun' /usr/lib/ruby/1.8/mongrel/configurator.rb:281:in each' /usr/lib/ruby/1.8/mongrel/configurator.rb:281:inrun' /usr/lib/ruby/1.8/mongrel/command.rb:212:in `run'

/u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:1567:in find_from_ids' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:616:infind' /data/markus/instance/csc108-2009-09/app/controllers/results_controller.rb:116:in download' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:1331:insend' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:1331:in perform_action_without_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/filters.rb:617:incall_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/filters.rb:610:in perform_action_without_benchmark' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/benchmarking.rb:68:inperform_action_without_rescue' /u/drprj/.gem/ruby/1.8/gems/activesupport-2.3.4/lib/active_support/core_ext/benchmark.rb:17:in ms' /usr/lib/ruby/1.8/benchmark.rb:308:inrealtime' /u/drprj/.gem/ruby/1.8/gems/activesupport-2.3.4/lib/active_support/core_ext/benchmark.rb:17:in ms' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/benchmarking.rb:68:inperform_action_without_rescue' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/rescue.rb:160:in perform_action_without_flash' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/flash.rb:146:inperform_action' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:532:in send' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:532:inprocess_without_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/filters.rb:606:in process' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:391:inprocess' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:386:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/routing/route_set.rb:437:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:87:in dispatch' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:121:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-
2.3.4/lib/actioncontroller/dispatcher.rb:130:in build_middleware_stack' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/head.rb:9:incall' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/head.rb:9:in call' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/methodoverride.rb:24:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/params_parser.rb:15:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/session/abstract_store.rb:122:incall' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/query_cache.rb:29:in call' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/query_cache.rb:34:incache' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/query_cache.rb:9:in cache' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/query_cache.rb:28:incall' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/failsafe.rb:26:incall' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/lock.rb:11:in call' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/lock.rb:11:insynchronize' /u/drprj/.gem/ruby/1.8/gems/rack-1.0.0/lib/rack/lock.rb:11:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:106:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/cgi_process.rb:44:in dispatch_cgi' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:101:indispatch_cgi' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:27:in dispatch' /usr/lib/ruby/1.8/mongrel/rails.rb:76:inprocess' /usr/lib/ruby/1.8/mongrel/rails.rb:74:in synchronize' /usr/lib/ruby/1.8/mongrel/rails.rb:74:inprocess' /usr/lib/ruby/1.8/mongrel.rb:159:in process_client' /usr/lib/ruby/1.8/mongrel.rb:158:ineach' /usr/lib/ruby/1.8/mongrel.rb:158:in process_client' /usr/lib/ruby/1.8/mongrel.rb:285:inrun' /usr/lib/ruby/1.8/mongrel.rb:285:in initialize' /usr/lib/ruby/1.8/mongrel.rb:285:innew' /usr/lib/ruby/1.8/mongrel.rb:285:in run' /usr/lib/ruby/1.8/mongrel.rb:268:ininitialize' /usr/lib/ruby/1.8/mongrel.rb:268:in new' /usr/lib/ruby/1.8/mongrel.rb:268:inrun' /usr/lib/ruby/1.8/mongrel/configurator.rb:282:in run' /usr/lib/ruby/1.8/mongrel/configurator.rb:281:ineach' /usr/lib/ruby/1.8/mongrel/configurator.rb:281:in run' /usr/bin/mongrel_rails:129:inrun' /usr/lib/ruby/1.8/mongrel/command.rb:212:in `run' /usr/bin/mongrel_rails:282

Request

Parameters:
{"commit"=>"Download", "authenticity_token"=>"HqzHOx3y4CQj1JdVTwxzvwbteaI/UD7RN0bAX/77xuI="}

Show session dump

Response

Headers:

{"Content-Type"=>"", "Cache-Control"=>"no-cache"}

Modified by c6conley 5 months ago:

Seems to be a Rails issue - see: https://rails.lighthouseapp.com/projects/8994/tickets/1112-redundant-utf-8-sequence-in-stringto_json

Migrate gem dependency installations to Bundler

It seems Rails 3 will be going with Bundler. Also, we are getting deprecation warnings for time-warp and db_populate Rails plug-ins. For those 2 plug-ins gems exist, which we can use. Once we use the gems we shouldn't get deprecation warnings anymore.

I think it would be a good idea to use Bundler in future to do gem installation. See http://gembundler.com/rails23.html and http://gembundler.com/rails3.html.

This will also mean to "break" our existing deployment documentation. We should have brand new deployment instructions once MarkUs 1.0 is out. Provided we use sqlite3 as initial developer database setup we should be able to make it easier for new developers to get started, too.

Make grader view work in IE

The only thing that didn't appear to work was creating annotations - this is due to Microsoft's implementation of window.getSelection() - might not be able to get around this for a while.

Modified by reid 1 year ago:

It would be useful to know what the problems are on different browsers.

Modified by c6conley 1 year ago:

MarkUs in IE6 is garbled, and essentially useless.

MarkUs in IE7 is surprisingly OK - everything looks box-y, but that's just styling. The only thing that didn't appear to work was creating annotations - this is due to Microsoft's implementation of window.getSelection() - might not be able to get around this for a while.

Modified by c8gehwol 1 year ago:

summary changed from OLM needs to be tested extensively using Internet Explorer to MarkUs needs to be tested extensively using Internet Explorer.

Modified by g9jerboa 1 year ago:

summary changed from MarkUs needs to be tested extensively using Internet Explorer to Make grader view work in IE.
The goal was to have MarkUs working with all major browsers when logged in as a student. That works so far.

The grader view still works in Firefox only. This isn't as easy as plain testing. The aim is to get the grader view working in IE 7+. I'll change the title and leave it unassigned for now.

Modified by g9jerboa 5 months ago:

priority_name changed from medium to high.
This is a cross-browser issue. I think this is important enough to be a high priority ticket.

Modified by benjaminvialle 2 months ago:

milestone changed from someday to June 2010.
Is it working correctly with IE8, which is the latest stable version of Internet Explorer ?

Modified by g9browni 2 months ago:

It doesn't work with IE8, and I envision that it is going to be a lot of work to get around the issue...

Annotations using upload doesn’t add in the format listed

When add a line in csv file as “category_name, annotation_text, annotation_text ...”, all text added in annotation category and no text for that category even though separated by comma.

Later, I checked that uploading is not a problem. The format of comma separated confuses me. When add column wise, I was able to get the category with annotation text.

Ordering of CSV upload files is configurable for Admin and Students upload, but not for other CSV uploads

Ordering of CSV upload files is configurable for Admin and Students upload, but not for other CSV uploads:

We have file-uploads for:

* Users (Students, TAs, Admins)
* Groups (upload group formations)
* TA-Mapping (upload TAs)
* Rubrics (upload rubrics for marking)

The order in which we expect things is configurable for Admins and Students but not for others. We should probably implement this.

MarkUsLogger Strings should not have i18n

Right now, MarkUsLogger strings go through i18n.

Nelle rightly pointed out:

"I really don't think it is a good idea. From my point of view, logging systems should never be translated. If someone, one day, translates Markus into Russian, and some guy has problem with the installation, and the only logs we have are in Russian, there's a high chance that no one will be able to see what was going on."

This is a relatively easy fix - might be good as a "getting my feet wet" ticket.

Documentation for released tarballs needs to be updated

From Byron:

INSTALL DOCUMENTATION:

The config/environments/production.rb file needs to be configured earlier than indicated in the installation documentation. Specifically, you need to decide on the storage location before creating the instructor. You also need to make the directory for the svn storage.

The "secret" is in config/environment.rb, not in config/environments/production.rb as indicated by the install doc.

production.rb/development.rb:

REPOSITORY_EXTERNAL_BASE_URL "only makes sense" if you're using external commits. We should make it more clear that you can just leave it blank, or comment it out if you're never using external commits.

REPOSITORY_PERMISSION_FILE documentation lists two scenarios. In the second one, I think the 'true' should be 'false'.

OTHER:

More help on configuring the mongrel cluster would be nice (ie: comments in the config file).

Error needs to be converted to string

Error information for saving the Mark can't pop up correctly.

TypeError (can't convert ActiveRecord::Errors into String): app/controllers/results_controller.rb:208:in update_mark' -e:2:inload' -e:2

Modified by g9jerboa 5 months ago:

I think this has been fixed.

Modified by g9browni 2 months ago:

It is not fixed, I just noticed it happening when I run functional tests with some code modified... makes it hard to figure out what the actual error was!

Add Tags to releases

Git added the possibility to add tags to releases.
Check the file NAMED_REVISIONS to know which commit to tag.

Improve User Documentation

...because right now there's only developer documentation.

Some ideas:

* Perhaps it's a good idea to segment the documentation by user type - Student, Grader, Instructor...
* Documentation should be hosted on markusproject.org, and linked to from installations

Consolidate flash[:some_name] messages

At various places in our controllers different flash[] notices are used. For example, there are at least

* flash[:fail_notice]
* flash[:upload_notice]
* flash[:invalid_lines]
* flash[:users_not_found]
* flash[:edit_notice]

I think it would be beneficial if we could come up with a sort of standard set, which we document on the wiki as to how what to use when and how. Have a short description of each and what it does, etc.

This is especially useful for UI refactoring. Assume MarkUs will be undertaken, yet another UI redesign. The person in charge of the UI would know that the documented set has to be implemented. What's more, developers have a place to look at for controller development.

Deployment: Reconsider which things to include for released versions of MarkUs

The size of MarkUs continues to grow. At the moment we are at 15Mb for the whole trunk folder. Of these 15Mb, 6.9Mb has the folder /vendor and inside "vendor" /vendor/selenium-rc 5.4Mb. I don't know if people installing MarkUs in production would need all of our testing libraries. Also, we have 4.9Mb for folder /public of which 4.1Mb are images. We have an extensive icon library, but we are using only some of them. There is also room to save space.

Stripping MarkUs down for release would approximately result in a 3Mb installation for production as compared to a 15Mb development bubble (creating a tar-archive would probably make it < 1Mb, which would be nice).

Maybe at some point creating a script, which turns a development svn export into a trimmed down version for release would be nice.

Adding a new group when repos are external

If the repositories are not created by MarkUs, we currently need to upload a file to create the groups. It would be nice to add all that information in using the add group button to add additional groups.

sporadic problem with repo names

I have an assignment set up to be no web submit, and work alone I asked students to log in to find out their repo path. For most students, the repo name is their user id, but for a small number it is group_XXXX? This is puzzling, and a bit problematic.

No way to delete Assignments

There doesn't seem to be a way to delete Assignments in the UI. This is pretty low priority, but probably necessary.

groups and repository creation bug?

Here is the scenario: For A0, Paul wants the students to work alone, but he wants to populate their repositories with some starter code. Students will not be using the web interface to commit files.

The question is when do the repos get created? Shouldn't they get created when the groups are created?

Paul used the following format for uploading a csv groups file: repo_c0foo,repo_c0foo,c0foo repo_c0bar,repo_c0bar,c0bar

However, checking out the repositories doesn't work (403 forbidden). Also clicking on the repo name to get to the repo view yield a MarkUs error.

RuntimeError in SubmissionsController#repo_browser

Repository not found and MarkUs not in authoritative mode! RAILS_ROOT: /data/markus/instance/csc207-2010-09

Application Trace | Framework Trace | Full Trace /data/markus/instance/csc207-2010-09/app/models/group.rb:113:in repo' /data/markus/instance/csc207-2010-09/app/controllers/submissions_controller.rb:70:inrepo_browser'

Request

Parameters:

{"id"=>"1"} Show session dump

Response

Headers:

{"Content-Type"=>"",
"Cache-Control"=>"no-cache"}
RuntimeError in SubmissionsController#repo_browser

Repository not found and MarkUs not in authoritative mode! RAILS_ROOT: /data/markus/instance/csc207-2010-09

Application Trace | Framework Trace | Full Trace /data/markus/instance/csc207-2010-09/app/models/group.rb:113:in repo' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:215:insend' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:215:in method_missing' /data/markus/instance/csc207-2010-09/app/controllers/submissions_controller.rb:70:inrepo_browser' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:1331:in send' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:1331:inperform_action_without_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/filters.rb:617:in call_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/filters.rb:610:inperform_action_without_benchmark' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue' /u/drprj/.gem/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/core_ext/benchmark.rb:17:inms' /usr/lib/ruby/1.8/benchmark.rb:308:in realtime' /u/drprj/.gem/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/core_ext/benchmark.rb:17:inms' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/rescue.rb:160:inperform_action_without_flash' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/flash.rb:151:in perform_action' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:532:insend' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:532:in process_without_filters' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/filters.rb:606:inprocess' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:391:in process'
/u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:386:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/routing/route_set.rb:438:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:87:indispatch' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:121:in _call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:130:inbuild_middleware_stack' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:29:in call' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:29:incall' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in cache' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:9:incache' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:28:in call' /u/drprj/.gem/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/string_coercion.rb:25:in call' /u/drprj/.gem/ruby/1.8/gems/rack-1.1.0/lib/rack/head.rb:9:incall' /u/drprj/.gem/ruby/1.8/gems/rack-1.1.0/lib/rack/methodoverride.rb:24:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/params_parser.rb:15:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/session/cookie_store.rb:99:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/failsafe.rb:26:incall' /u/drprj/.gem/ruby/1.8/gems/rack-1.1.0/lib/rack/lock.rb:11:in call' /u/drprj/.gem/ruby/1.8/gems/rack-1.1.0/lib/rack/lock.rb:11:insynchronize' /u/drprj/.gem/ruby/1.8/gems/rack-1.1.0/lib/rack/lock.rb:11:in call' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:106:incall' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/cgi_process.rb:44:in dispatch_cgi' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:101:indispatch_cgi' /u/drprj/.gem/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:27:in dispatch' /usr/lib/ruby/1.8/mongrel/rails.rb:76:inprocess' /usr/lib/ruby/1.8/mongrel/rails.rb:74:in synchronize' /usr/lib/ruby/1.8/mongrel/rails.rb:74:inprocess' /usr/lib/ruby/1.8/mongrel.rb:159:in process_client' /usr/lib/ruby/1.8/mongrel.rb:158:ineach' /usr/lib/ruby/1.8/mongrel.rb:158:in process_client' /usr/lib/ruby/1.8/mongrel.rb:285:inrun' /usr/lib/ruby/1.8/mongrel.rb:285:in initialize' /usr/lib/ruby/1.8/mongrel.rb:285:innew' /usr/lib/ruby/1.8/mongrel.rb:285:in run' /usr/lib/ruby/1.8/mongrel.rb:268:ininitialize' /usr/lib/ruby/1.8/mongrel.rb:268:in new' /usr/lib/ruby/1.8/mongrel.rb:268:inrun' /usr/lib/ruby/1.8/mongrel/configurator.rb:282:in run' /usr/lib/ruby/1.8/mongrel/configurator.rb:281:ineach' /usr/lib/ruby/1.8/mongrel/configurator.rb:281:in run' /usr/bin/mongrel_rails:129:inrun' /usr/lib/ruby/1.8/mongrel/command.rb:212:in `run' /usr/bin/mongrel_rails:282

Request

Parameters:

{"id"=>"1"} Show session dump

Modified by reid 2 weeks ago:

This turned out to be mostly a misunderstanding. MarkUs was configured to use external repos, but they hadn't been created yet. There was also some kind of issue on the server unrelated to MarkUs.

It would be nice to have a sensible error message in this case however.

Role based access control

For the next version, we may want to use a better role-based access control approach.

Suggested approach is a new table, with two columns: role, capability.

Role would be something like 'admin', and capability would be something like 'can_create_assignment'.

Then we'd just to a before_filter on all Controllers, which would run on each Controller method call, checking to see if the user performing the action has a role, which has the capability to do what is being done.

Clean up some of the bulk_action methods

For example, take a look at GroupsController.bulk_action. It's absolutely massive, and violates single responsibility principle.

Maybe break this off into chunks, using the GroupsHelper or something.

Same with SubmissionsController.update_submissions. Yeesh.

Modified by g9browni 2 months ago:

GroupsController.global_actions has been broken up as best I could manage. SubmissionsController.update_submissions still needs to be worked on.

Rubric YML file upload

There are errors when upload a rubric file generated by markus.

There are also problems with the errors messages (as it was never tested with yml files, the errors messages displayed concern only CSV file. Therefor, when there is a problem uin a YML file upload, it displays information on how CSV file should be formatted)

Admin name not displayed to student

When an Admin is correcting a student's work and with the « display grader's name to student » option activated, the student can't see the name of the corrector.

It works fine when the corrector is a grader.

Server error on uploading duplicate files in student view

If a student tries to upload a file with the same name as a file they have already uploaded to MarkUs, they get a "500 Internal Server Error" page. The error is ActionController::Session::CookieStore::CookieOverflow.

Modified by g9browni 1 month ago:

The cause of this error seems to be an extra long flash message that exceeds the cookie size limit. Apparently we are storing flash messages in the cookie.

In ResultsController.edit - move some of the Groupings processing down to the database layer

In #markus on Sept 30th (3:30PM), mikeg1a wrote:

In fact, if you wanted to gnaw on that more from a code standpoint, I'd probably push you to eliminate this whole idea of retrieving a bunch of stuff into an array and then deleting the ones you don't want

Looking at the results_controller code, what I'd probably like to see in the controller is

if current_user.admin? groupings = @assignment.groupings.unmarked end

And then add an unmarked named scope to groupings which would both shove the work down to the database layer, and make the code easier to read

Formatting not preserved in annotations

Formatting is not preserved in annotations, so lists of things like:

-This -Is -A -List

Just show up in a line (which is how it'll show up in Dr. Project too, until you look at the text of this comment)

Check out public/javascripts/SourceCodeGlower/AnnotationTextDisplayer.js - this file defines the class that handles the displaying of AnnotationTexts.

Note the displayCollection method, and how it just wraps everything up with

. Here's where the changes should be made.

Possible solutions:

-Instead of modifying AnnotationTextDisplayer, style the annotation_text_display class so that text is preformatted. Then, remove the

's from AnnotationTextDisplayer.

-Do some search/replace in AnnotationTextDisplayer, and replace n with

Investigate Large Table Bottlenecks

From Byron:

Building lists of submissions, students, etc. is really slow. Speeding them up would be really nice! Do some profiling to find the bottlenecks, build some more indices, ... I don't see anything inherent that should make it this slow.

Modified by anonymous 2 months ago:

loading of submissions view was improved significantly in revision 1376

System allows to add more than 1 member even if Group Properties of an assignment is set upto 1 people in a group

Steps to reproduce: Select Group and Graders -> Create a new Group-> Expand Graders ->Select one or more Graders and Click on Randomly Assign Graders.

Expected:A pop up confirmation that this action will Assign Graders to Groups without members(Not Valid yet) similar to a warning message when clicks on Valid for a group with no members.

Modified by reid 1 year ago:
A warning message would be nice

Rename TA and Admin models?

We seem to be of two minds here (symptomatic of the turnover on this project) - Graders are also referred to as TAs. Admins are also referred to as Instructors.

These models should probably just be renamed to be Grader and Instructor.

Diplaying server's time on student view

It may be interesting to display the hour of the server at least to the students.

Evan's suggestion :

Displaying the server time would certainly help deal with students who might complain that according to “their clock” they handed it in on time ;) It could be a good idea...

Here is Severin's answer :

IMO anything more frequent than once a minute would be overkill. But
I don't expect too much overhead for such requests (XHR), since they
wouldn't require DB-queries.

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.