OneRoster 1.1 / 1.2 Dual Support — Plan
Goal
Make OneRosterSampleDataGenerator capable of generating CSV output compatible with both OneRoster v1.1 and v1.2, selectable via configuration.
Approach
- Add
OneRosterVersion enum (V1_1, V1_2) exposed on Args
- Default to
V1_1 for backward compatibility
- Separate export DTOs per version organized by namespace/folder:
Models/Exports/ — v1.1 (existing, unchanged)
Models/Exports/V12/ — v1.2 (new)
- Domain models (
User, Enrollment, etc.) remain mostly version-agnostic; only CSV column schemas differ
New Files
| File |
Purpose |
Models/Role.cs |
Domain model: userSourcedId, role, orgSourcedId, beginDate, endDate |
Models/Roles.cs |
Generator: creates one Role per user-org-role (v1.2 only) |
Models/Exports/V12/RoleFile.cs |
Export DTO for roles.csv |
Models/Exports/V12/UserFile.cs |
v1.2 user CSV: primaryOrgSourcedId, preferredGivenName, preferredMiddleName, preferredFamilyName, userMasterIdentifier, pronouns; no orgSourcedIds or role |
Models/Exports/V12/DemographicFile.cs |
v1.2 demographic CSV: expanded sex enum (unspecified, other) |
Modified Files
| File |
Changes |
Models/Vocab.cs |
Add OneRosterVersion enum; expand Gender for v1.2 |
OneRoster.cs |
Add Version to Args; pass to FileProcessor; conditionally call Roles generator + output roles.csv |
FileProcessor.cs |
Accept OneRosterVersion param; route to V11 or V12 export DTOs via switch |
Models/Manifests.cs |
Accept version; set oneroster.version and file entries accordingly |
Consts.cs |
Add RolesFile constant |
Models/Interfaces/ILeaUser.cs |
Add PreferredGivenName, PreferredFamilyName, PrimaryOrgSourcedId (nullable — used by v1.2) |
Models/User.cs |
Implement new interface members |
Key v1.2 CSV Schema Changes
users.csv
- Removed:
orgSourcedIds, role (moved to roles.csv)
- Added:
primaryOrgSourcedId, preferredGivenName, preferredMiddleName, preferredFamilyName, userMasterIdentifier, pronouns
demographics.csv
sex enum expanded: male | female | unspecified | other
roles.csv (new)
| Column |
Required |
Description |
| sourcedId |
Yes |
Unique ID |
| status |
Yes for Delta |
active / tobedeleted |
| dateLastModified |
Yes for Delta |
DateTime |
| userSourcedId |
Yes |
Link to user |
| role |
Yes |
administrator / proctor / student / teacher |
| orgSourcedId |
Yes |
Link to org |
| beginDate |
No |
Start of role assignment |
| endDate |
No |
End of role assignment |
manifest.csv
oneroster.version = "1.2"
- 8 new file entries for v1.2 CSV files (all
"absent" by default)
Implementation Order
- Add
OneRosterVersion enum to Vocab.cs
- Add
Version to Args in OneRoster.cs
- Update
ILeaUser.cs / User.cs with optional v1.2 properties
- Create
Role.cs + Roles.cs domain/generator
- Create
Models/Exports/V12/ folder with UserFile.cs, DemographicFile.cs, RoleFile.cs
- Update
FileProcessor.cs for version-aware routing
- Update
Manifests.cs for versioned output
- Update
OneRoster.cs for v1.2 pipeline (roles generation + output)
- Update
Consts.cs
- Update tests — parameterize over version, add v1.2 coverage
- Verify:
dotnet build && dotnet test
Backward Compatibility
- Default
V1_1 — zero consumer changes
- v1.2 opt-in:
new OneRoster(new Args { Version = OneRosterVersion.V1_2 })
- NuGet version:
1.1.0-beta
OneRoster 1.1 / 1.2 Dual Support — Plan
Goal
Make
OneRosterSampleDataGeneratorcapable of generating CSV output compatible with both OneRoster v1.1 and v1.2, selectable via configuration.Approach
OneRosterVersionenum (V1_1,V1_2) exposed onArgsV1_1for backward compatibilityModels/Exports/— v1.1 (existing, unchanged)Models/Exports/V12/— v1.2 (new)User,Enrollment, etc.) remain mostly version-agnostic; only CSV column schemas differNew Files
Models/Role.csModels/Roles.csRoleper user-org-role (v1.2 only)Models/Exports/V12/RoleFile.csroles.csvModels/Exports/V12/UserFile.csprimaryOrgSourcedId,preferredGivenName,preferredMiddleName,preferredFamilyName,userMasterIdentifier,pronouns; noorgSourcedIdsorroleModels/Exports/V12/DemographicFile.csunspecified,other)Modified Files
Models/Vocab.csOneRosterVersionenum; expandGenderfor v1.2OneRoster.csVersiontoArgs; pass toFileProcessor; conditionally callRolesgenerator + outputroles.csvFileProcessor.csOneRosterVersionparam; route to V11 or V12 export DTOs via switchModels/Manifests.csoneroster.versionand file entries accordinglyConsts.csRolesFileconstantModels/Interfaces/ILeaUser.csPreferredGivenName,PreferredFamilyName,PrimaryOrgSourcedId(nullable — used by v1.2)Models/User.csKey v1.2 CSV Schema Changes
users.csv
orgSourcedIds,role(moved toroles.csv)primaryOrgSourcedId,preferredGivenName,preferredMiddleName,preferredFamilyName,userMasterIdentifier,pronounsdemographics.csv
sexenum expanded:male | female | unspecified | otherroles.csv (new)
manifest.csv
oneroster.version="1.2""absent"by default)Implementation Order
OneRosterVersionenum toVocab.csVersiontoArgsinOneRoster.csILeaUser.cs/User.cswith optional v1.2 propertiesRole.cs+Roles.csdomain/generatorModels/Exports/V12/folder withUserFile.cs,DemographicFile.cs,RoleFile.csFileProcessor.csfor version-aware routingManifests.csfor versioned outputOneRoster.csfor v1.2 pipeline (roles generation + output)Consts.csdotnet build && dotnet testBackward Compatibility
V1_1— zero consumer changesnew OneRoster(new Args { Version = OneRosterVersion.V1_2 })1.1.0-beta