To add constraints to a requirement category:
min_credits, max_creditsmin_courses, max_coursesmin_level, min_courses_at_leveltag, tag_value, min_coursesOptionally add scope_subject_codes to limit which courses the constraints apply to
List your course options in subsequent rows with empty constraint columns
That’s it! The system will automatically create the appropriate constraints based on which columns have values. The constraint_type column is technically optional because the system intelligently detects which constraints to create based on the filled columns. But it is recommended to provide a constraint type when possible
The CSV format combines program requirements, grouping rules, and constraints into a single file. This simplifies the upload process by eliminating the need for separate requirements and constraints CSV files.
To add constraints to a requirement category:
min_credits, max_creditsmin_courses, max_coursesmin_level, min_courses_at_leveltag, tag_value, min_coursesOptionally add scope_subject_codes (space-delimited) to limit which courses the constraints apply to
List your course options in subsequent rows with empty constraint columns
The system automatically creates constraints based on which columns have values. The constraint_type column is optional but recommended for clarity.
This CSV format allows you to define program requirements, course groupings, and constraints in a single file.
BIOS CHEM PHYS)| Column | Description | Example |
|---|---|---|
program_name |
Name of the academic program | “Biology B.S.” |
category |
Requirement category name | “BIOS Electives” |
requirement_type |
Type of requirement: simple or grouped |
grouped |
semester |
Academic semester | Fall |
year |
Academic year | 2025 |
is_current |
Whether this is the current version (true/false) | true |
| Column | Description | Example |
|---|---|---|
group_name |
Name of the course group | “Electives” |
course_code |
Specific course code | “BIOS 301” |
institution |
Institution offering the course | “State University” |
is_preferred |
Whether this is a preferred option (true/false) | false |
How to specify constraints: Simply fill in the constraint columns you need. The system automatically detects and creates constraints based on which columns have values. You can mix multiple constraint types in a single row!
| Column | Description | When to Use | Example |
|---|---|---|---|
constraint_type |
Name the primary constraint type | For clarity in complex CSVs | credits |
min_credits |
Minimum credits required | When you need a credit minimum | 10 |
max_credits |
Maximum credits allowed | When you need a credit maximum | 15 |
min_courses |
Minimum number of courses | When you need course count minimum | 3 |
max_courses |
Maximum number of courses | When you need course count maximum | 5 |
min_level |
Minimum course level (e.g., 3000 for 3000+) | When you need level-based filtering | 3000 |
min_courses_at_level |
Number of courses required at or above level | Used with min_level |
2 |
tag |
Tag field name to check (e.g., has_lab, course_type) | When filtering by course attributes | has_lab |
tag_value |
Required tag value | Used with tag |
true |
scope_subject_codes |
Limit constraints to specific subject codes | Optional for any constraint | “BIOS” |
Note: The constraint_type column is now optional and serves as documentation. The system intelligently creates constraints based on which columns contain values.
Students must take between 10-15 credits from the elective list.
program_name,category,requirement_type,semester,year,is_current,group_name,course_code,institution,is_preferred,constraint_type,min_credits,max_credits,scope_subject_codes
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,credits,10,15,BIOS
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 301,"State University",true,"","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 305,"State University",false,"","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 401,"State University",false,"","","",""
Students must take between 3-5 courses from the elective list.
program_name,category,requirement_type,semester,year,is_current,group_name,course_code,institution,is_preferred,constraint_type,min_courses,max_courses
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,courses,3,5
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 301,"State University",true,"","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 305,"State University",false,"","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 401,"State University",false,"","",""
Students must take at least 2 courses at the 3000+ level.
program_name,category,requirement_type,semester,year,is_current,group_name,course_code,institution,is_preferred,constraint_type,min_level,min_courses_at_level,scope_subject_codes
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,level,3000,2,BIOS
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 301,"State University",true,"","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 305,"State University",false,"","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 401,"State University",false,"","","",""
Students must have at least 2 courses with a lab component.
program_name,category,requirement_type,semester,year,is_current,group_name,course_code,institution,is_preferred,constraint_type,tag,tag_value,min_courses,scope_subject_codes
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,tag,has_lab,true,2,BIOS
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 301,"State University",true,"","","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 305,"State University",false,"","","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 401,"State University",false,"","","","",""
You can add multiple rows with different constraint types for the same category. Each constraint will be applied.
program_name,category,requirement_type,semester,year,is_current,group_name,course_code,institution,is_preferred,constraint_type,min_credits,min_courses,min_level,min_courses_at_level,tag,tag_value,scope_subject_codes
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,credits,10,"","","","","",BIOS
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,courses,"",3,"","","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,level,"","",3000,2,"","",BIOS
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 300,"State University",false,tag,"","","","",has_lab,true,BIOS
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 301,"State University",true,"","","","","","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 305,"State University",false,"","","","","","","",""
"Biology B.S.","BIOS Electives",grouped,Fall,2025,true,"Electives",BIOS 401,"State University",false,"","","","","","","",""
Important Notes:
What it does: Requires a minimum and/or maximum number of credits to be completed.
How to use:
constraint_type = creditsmin_credits and/or max_credits| constraint_type | min_credits | max_credits |
|---|---|---|
| credits | 10 | 15 |
What it does: Requires a minimum and/or maximum number of courses to be completed.
How to use:
constraint_type = coursesmin_courses and/or max_courses| constraint_type | min_courses | max_courses |
|---|---|---|
| courses | 3 | 5 |
What it does: Requires a certain number of courses at or above a specific level (e.g., 3000-level courses).
How to use:
constraint_type = levelmin_level (the course level threshold, e.g., 3000)min_courses_at_level (how many courses must be at or above this level)| constraint_type | min_level | min_courses_at_level |
|---|---|---|
| level | 3000 | 2 |
What it does: Requires courses with a specific tag/attribute (e.g., has_lab, course_type).
How to use:
constraint_type = tagtag (the field name to check, e.g., has_lab)tag_value (the required value, e.g., true)min_courses (how many courses must have this tag)| constraint_type | tag | tag_value | min_courses |
|---|---|---|---|
| tag | has_lab | true | 2 |
What it does: Limits the constraint to only apply to courses from specific subject codes.
How to use:
scope_subject_codes with space-separated subject codes| constraint_type | min_courses | scope_subject_codes |
|---|---|---|
| courses | 3 | BIOS BIO |
When the CSV is uploaded, the backend:
constraint_type column from each rowconstraint_type is specified, collects the relevant constraint parameterscategory_constraints dictionary for later processingconstraint_type='credits': Creates constraint with min_credits and/or max_creditsconstraint_type='courses': Creates constraint with min_courses and/or max_coursesconstraint_type='level': Creates constraint with min_level and min_courses_at_levelconstraint_type='tag': Creates constraint with tag, tag_value, and min_coursesis_current flags for program versionsFor most requirements, you’ll want to specify just one constraint type:
Option A: Credit-based (most common)
constraint_type=credits and specify min_creditsOption B: Course-count based
constraint_type=courses and specify min_coursesOption C: Level-based
constraint_type=level and specify min_level and min_courses_at_levelYou can combine multiple constraints by adding separate rows with different constraint types. Each constraint will be validated independently.
Use scope_subject_codes to limit which courses count toward the constraint. This is useful when:
If you have existing CSV files using the old format, they will still work. The backend supports both:
course_option instead of course_codecourses_required for groupcredits_required for categorycredits_required_group for groupdescription, group_description, option_notescourse_code (cInstructions naming)credits, courses, level, or tag) and fill in the corresponding columns| Type | Description | When to Use | Required Columns | Implementation Status |
|---|---|---|---|---|
simple |
Single course or specific requirement | Exact course requirements (e.g., “BIOS 1010 is required”) | course_code |
Fully Implemented |
grouped |
Choose X courses from a list | Electives with options (e.g., “Choose 3 from 5 BIOS courses”) | group_name, courses_per_group, total_credits_per_group |
Fully Implemented |
conditional |
If/then logic for courses | FUTURE FEATURE - Transfer scenarios, prerequisite chains, alternate pathways | TBD | Not Yet Implemented |
Current Status: The conditional type is recognized by the system but currently behaves identically to simple requirements. This is a placeholder for future use where things like “take A before B are better handled by the backend.
Planned Use Cases:
Current Recommendation: Use grouped requirements with constraints for most complex scenarios. The grouped type with appropriate constraints can handle the majority of real-world academic requirements.
| Type | Description | Example Use Case | CSV Columns Needed |
|---|---|---|---|
| Credits | Min/max credit limits | “10-15 credits required” | min_credits, max_credits |
| Courses | Min/max course count | “At least 3 courses” | min_courses, max_courses |
| Level | Minimum course level | “2 courses at 3000+ level” | min_level, min_courses_at_level |
| Tag | Filter by course attributes | “Require 2 lab courses” or “Max 7 research credits” | tag, tag_value, min_courses OR max_credits |
has_labField Type: Boolean
Description: Indicates if the course has a lab component
| Value | Meaning | CSV Format |
|---|---|---|
true |
Course has a lab | has_lab,true |
false |
Course does not have a lab | has_lab,false |
Example Constraint:
tag,tag_value,min_courses
has_lab,true,2
“Require at least 2 courses with labs”
course_typeField Type: String
Description: Categorizes the course by instructional type
| Value | Description | CSV Format |
|---|---|---|
lecture |
Traditional lecture course (default) | course_type,lecture |
lecture_lab |
Combined lecture and lab | course_type,lecture_lab |
lab_only |
Laboratory-only course | course_type,lab_only |
research |
Research course | course_type,research |
seminar |
Seminar course | course_type,seminar |
independent_study |
Independent study course | course_type,independent_study |
Example Constraints:
tag,tag_value,min_courses
course_type,research,1
“Require at least 1 research course”
tag,tag_value,max_credits
course_type,research,7
“Allow maximum 7 credits of research courses”
Special Note: When filtering for research courses, the system automatically includes seminar and independent_study courses as they are treated similarly.
| Column | Description | Format | Example |
|---|---|---|---|
scope_subject_codes |
Limit constraints to specific departments | Space-separated subject codes | BIOS CHEM |
Example:
min_credits,scope_subject_codes
10,BIOS
“Require at least 10 credits from BIOS courses”
| Field | Description | Type | Example |
|---|---|---|---|
group_name |
Name of the course option group | String | “Upper-Level BIOS” |
courses_per_group |
Number of courses to choose from group | Integer | 3 |
total_credits_per_group |
Total credits required from group | Integer | 9 |
| Field | Valid Values | Notes |
|---|---|---|
semester |
Fall, Spring, Summer |
Case-sensitive |
year |
4-digit year | e.g., 2025 |
is_current |
true, false |
Lowercase boolean |
Format: 4-digit number representing the course level
| Level | Description | Example Courses |
|---|---|---|
1000 |
First-year undergraduate | BIOS 1010, CHEM 1110 |
2000 |
Second-year undergraduate | BIOS 2030, CHEM 2250 |
3000 |
Third-year undergraduate | BIOS 3010, CHEM 3110 |
4000 |
Fourth-year undergraduate | BIOS 4350, CHEM 4990 |
5000 |
Graduate level | BIOS 5250, CHEM 5310 |
Usage in Constraints:
min_level,min_courses_at_level
3000,2
“Require 2 courses at 3000+ level”
program_namecategoryrequirement_typesemesteryearis_currentcourse_codegroup_name (first row of group)courses_per_group (first row of group)total_credits_per_group (first row of group)course_code (all rows in group)constraint_type (optional documentation field)min_credits (for credit minimums)max_credits (for credit maximums)min_courses (for course count minimums or tag constraints)max_courses (for course count maximums)min_level (for level-based filtering)min_courses_at_level (number of courses at or above level)tag (field name: has_lab or course_type)tag_value (value to match: true/false for has_lab, or course type string)scope_subject_codes (limit to specific departments)description (optional text description)docs/equic-csvs/sample-templates/program_requirements.csvbackend/routes/upload.py - /upload/requirements endpointfrontend/src/components/CSVUpload.jsx