kasm (is) Another Submission Multitool (for Moodle). Pronounced chasm. Made for terminal warriors.
Just grab a release for your OS and put it in a path covered by $PATH (or equiv.)
e.g. via
sudo install -Dm 0755 kasm /usr/local/bin/kasmAlternatively, grab the source and build/install it with cargo:
cargo install --locked --path .- The initialization procedure creates a reusable master config, which contains info such as
- Your exercise group id
- The regex to match groups against
- The structure of the zip (are we expecting groupped folders in it?)
- A filter (regex) to only repack certain files.
You then have the choice between two workflows.
1. CSV & ZIP Workflow
- In the master directory, you create a slave by
kasm unpack. It contains- A slave config (
grades.toml) - The submission folders
- The filtered grading worksheet csv
- A slave config (
- To assign grades, use
kasm gradeor edit thegrades.tomlfile.kasm gradewill infer the team automagically if you're inside its subfolder- IMPORTANT! Always use the format Moodle expects (especially the decimal separator).
kasmdoesn't parse your inputs. They are taken at face-value as strings. kasm repack(in the master directory) packs the feedback into a zip file (feedback_$SHEET_$TIMESTAMP.zip) and grades intogrades_$SHEET_$TIMESTAMP.csv. Just upload these at the appropriate place in Moodle.
2. Autofetch Workflow
- Run
kasm setup-fetchonce to- define a course ID (look at the URL in your browser)
- save your Moodle Token to your OS's keyring (You can find the token under Moodle > Settings > Tokens > Moodle Mobile Mobile Service)
- Fetch an assignment using
kasm fetchfetchwill display a list of assignments to select from.
- Grade using
kasm grade - Publish your grades automatically using
kasm push - Repack your feedback zip using
kasm repack(in the master directory)- Note:
kasm repackwill NOT produce a .csv with Autofetch. You'll need to usekasm pushto publish grades.
- Note:
kasm currently has 8 subcommands
| Subcommand | Explanation |
|---|---|
| help | Get help for kasm or for any other subcommand |
| init | Creates a master config file in the current directory |
| unpack | Extracts a moodle zip file, filters a moodle csv for the given group and initializes a slave config in the new directory |
| repack | Repacks the zip for upload to Moodle and constructs a grading worksheet using the slave config |
| grade | Assigns a grade to a group. It is also able to infer the group number if you're currently in its directory. |
| setup-fetch | Saves the course ID to the master config and a Moodle API token to the user's keyring. |
| fetch | Fetches an assignment's submissions (no parameters/interactive) |
| push | Publishes grades (can only be used with fetch - not with unpack!!!) |
Example 1: Plain usage with CSV and ZIP
# cd to your master directorycd master
# init kasm (just once for multiple sheets!)# let's say we have group 01
kasm init -g 01
# unpack sheet 01
kasm unpack -s 01 -z /path/to/moodle.zip -c /path/to/moodle.csv
# look at group 01's filescd'unpack_01/Übungsgruppe 01 -- Abgabeteam 01'
...
# grade group 01 with 16,384 (while inside its folder)
kasm grade 16,384
# grade group 02 with 8,192 (while inside any folder inside the unpack_XX folder)
kasm grade 8,192 02
# go back to master folder and repack sheet 01cd ../../
kasm repack 01Example 2: Autofetch workflow
# cd to your master directorycd master
# setup the autofetch workflow (needs course ID and moodle token)
kasm fetch-setup
# fetch some assignment (interactive)
kasm fetch
# look at group 01's filescd'unpack_01/Übungsgruppe 01 -- Abgabeteam 01'
...
# grade group 01 with 16,384 (while inside its folder)
kasm grade 16,384
# publish grades AUTOMAGICALLY
kasm push
# go back to master and repack (ONLY the ZIP file will get# repacked if you use autofetch)cd ../../
kasm repack 01All of these would be better off as script-hooks
Recursively extract zips[CANCELED]Prepend all extracted PDFs with e.g. a grading table[CANCELED]Generate said grading table dynamically (LaTeX/Handlebars)[CANCELED]
- Add script hooks
Support unpacking groups and then repacking groups- Support unpacking individuals and then repacking individuals
- Support unpacking individuals and then groupping them
- Hardcode less stuff. Things like target directory names should be handled e.g. by Handlebars to make everything more easily modifiable for special cases (and if Moodle breaks again)
Automatically download submissions (Moodle API + Token + Page ID)(Only G2G for now)Automatically publish grades(Only G2G for now)- Automatically upload feedback
- Expects the moodle csv header to be in German. To change, edit
src/gradingtable.rsand recompile. - No support for nested directiories inside teams' folders when repacking (probably not a problem).
- As discussed above, only group -> individual/group mapping is currently implemented.
Licensed under EUPL-1.2-or-later. See license.