This repository provides two scripts to help instructors track student completion of an AI-use disclosure form submitted via Google Forms:
check_submissions.py: A command-line Python tool that generates per-class reports and flags exceptions (unmatched student names or assignments).check_submissions_ui.py: A Streamlit-based web UI that offers an interactive interface for uploading roster and assignment files, specifying the Google Forms CSV URL, configuring output paths, and saving/loading configurations.
- Multi-class support: Process an arbitrary number of classes by pairing
CLASS.txtroster files with correspondingCLASS-assignments.txtassignment lists. - Normalization: Handles variations in class names, assignment labels (unifies dashes and whitespace), and form headers.
- Exception reporting: Flags any
(student, assignment)pairs not matching your master lists. - CSV outputs: Generates per-class
CLASS-report.csvandCLASS-exceptions.csvfiles. - Config persistence (UI only): Save and load your sidebar settings in a single JSON file.
Both scripts require:
- Python 3.7+
- pandas for CSV parsing
Additionally, the UI script requires Streamlit.
Install dependencies:
pip install pandas
# For UI script only:
pip install streamlit-
Prepare your text files:
CLASS.txt: One student name per line (e.g.,psy393.txt).CLASS-assignments.txt: One assignment name per line (e.g.,psy393-assignments.txt).
-
Run the script:
python check_submissions.py \ --students psy393.txt epy601.txt \ --assignments psy393-assignments.txt epy601-assignments.txt \ --responses-url "https://docs.google.com/spreadsheets/d/e/.../pub?output=csv" \ --output-dir reports -
Output:
reports/psy393-report.csvreports/psy393-exceptions.csv- ... and similarly for
epy601.
--students: Space-separated list of roster files.--assignments: Space-separated list of assignment-list files (must end in-assignments.txt).--responses-url: Published Google Sheets CSV URL for your form responses.--output-dir: Directory to write the per-class CSVs.
streamlit run check_submissions_ui.py- Load configuration (
.json) to prefill URL and output path. - Google Form CSV URL: Paste your
.../pub?output=csvlink. Here is a copy of my form that you can copy to your own account: https://docs.google.com/forms/d/1FcdzUhvX6Jhh5xdNXBO5sMfTfH9XEqeNhvx-d5lhY14/edit - Upload roster files (
.txt) and assignment files (.txt). - Output directory: Specify where CSVs should be saved.
- Run Report:
- Displays per-class tables for submissions and exceptions.
- Provides Download buttons for each CSV.
- Offers a Save configuration download to reuse settings.
- Reading form responses: Both scripts override the Google Forms header, applying fixed column names for reliable parsing.
- Normalization:
- Class codes are lowercased and non-alphanumeric stripped for matching.
- Assignment labels unify all dash variants to
-and collapse whitespace.
- Reporting:
- Groups responses by class and assignment.
- Computes who has submitted and who is missing per assignment.
- Exceptions: Any
(student, assignment)row not in your master lists is flagged and output separately.
Feel free to open issues or pull requests to improve functionality—especially for features like:
- Automated email reminders.
- Fuzzy matching for minor typos.
- Support for additional form fields or custom validations.
Happy teaching! 🎓
