EASE: EPITA Auriga Schedule Exporter
How to
Using pipx (recommended)
Install EASE with pipx:
pipx install epita-ease
You can then set-up EASE by running ease-setup, and use EASE by running ease. Updates can then be run using pipx update ease.
Note: If pipx is not installed, you should be able to install it with pip install pipx.
Using uv and virtual environments
This was meant to be run with uv; it allows seamless use of virtual environments and handles Python versions and dependency installation on its own. You can install it on GNU/Linux systems with the following:
curl -LsSf https://astral.sh/uv/install.sh | sh
You can then set up EASE:
uv run setup
Warning : your password will be stored in plaintext
Finally, you can just run EASE anytime you want an export of your calendar :)
uv run ease
General algorithm
- Connects to auriga.epita.fr
- Gets redirected into oblivion for a bit
- Inputs credentials (you can do that manually too)
- Logs in
- Hijacks the auth token
- Exports the calendar's JSON for the current year
- Converts it into a .ics file
- ???
- Profit
Miscellaneous
JSON Schema
Yeah, those exports are big
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Interventions Export",
"type": "object",
"required": ["interventions", "unavailabilities"],
"properties": {
"interventions": {
"type": "array",
"items": {
"$ref": "#/$defs/intervention"
}
},
"unavailabilities": {
"type": "array"
}
},
"$defs": {
"localizedText": {
"type": "object",
"additionalProperties": {
"type": ["string", "null"]
}
},
"person": {
"type": "object",
"required": ["id", "currentFirstName", "currentLastName"],
"properties": {
"id": {
"type": "integer"
},
"currentFirstName": {
"type": "string"
},
"currentLastName": {
"type": "string"
}
}
},
"activityType": {
"type": "object",
"required": ["id", "code", "caption"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
}
}
},
"interventionReference": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"accountedDuration": {
"type": "integer"
},
"actualDuration": {
"type": "integer"
},
"startDateTime": {
"type": "string",
"format": "date-time"
},
"endDateTime": {
"type": "string",
"format": "date-time"
},
"additionalRemarks": {
"$ref": "#/$defs/localizedText"
},
"customAttributes": {
"type": "object"
}
},
"required": ["id"]
},
"interventionInstructor": {
"type": "object",
"required": ["id", "person"],
"properties": {
"id": {
"type": "integer"
},
"person": {
"$ref": "#/$defs/person"
}
}
},
"pedagogicalUnit": {
"type": "object",
"required": ["id", "code"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
},
"externalCode": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
}
},
"customAttributes": {
"type": "object"
}
}
},
"population": {
"type": "object",
"required": ["id", "code"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
},
"externalCode": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
}
},
"populationType": {
"type": "object"
}
}
},
"program": {
"type": "object",
"required": ["id", "code"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
}
}
},
"resourceType": {
"type": "object",
"required": ["id", "code"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
},
"isManagingConflictsEnabled": {
"type": "boolean"
}
}
},
"resource": {
"type": "object",
"required": ["id", "code"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
},
"description": {
"$ref": "#/$defs/localizedText"
},
"floor": {
"type": "integer"
},
"examCapacity": {
"type": "integer"
},
"totalCapacity": {
"type": "integer"
},
"isAccessibleForDisablePeople": {
"type": "boolean"
},
"isRoom": {
"type": "boolean"
},
"resourceType": {
"$ref": "#/$defs/resourceType"
}
}
},
"attendanceStatus": {
"type": "object",
"required": ["id", "code"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
}
}
},
"participation": {
"type": "object",
"required": [
"id",
"absenceExcused",
"isRemote",
"person"
],
"properties": {
"id": {
"type": "integer"
},
"absenceExcused": {
"type": "boolean"
},
"absenceReason": {
"type": "object"
},
"attendanceStatus": {
"$ref": "#/$defs/attendanceStatus"
},
"automaticRegistrationStatus": {
"$ref": "#/$defs/attendanceStatus"
},
"participationStatus": {
"type": "object"
},
"isRemote": {
"type": "boolean"
},
"person": {
"$ref": "#/$defs/person"
}
}
},
"timezone": {
"type": "object",
"required": [
"id",
"code",
"name"
],
"properties": {
"id": {
"type": "integer"
},
"abbreviation": {
"type": "string"
},
"code": {
"type": "string"
},
"description": {
"type": "string"
},
"dst": {
"type": "boolean"
},
"name": {
"type": "string"
},
"utcOffset": {
"type": "number"
},
"utcOffsetWithDst": {
"type": "number"
}
}
},
"interventionStatus": {
"type": "object",
"required": ["id", "code"],
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"caption": {
"$ref": "#/$defs/localizedText"
},
"isAccessAttendanceListsDisabled": {
"type": "boolean"
},
"isBillable": {
"type": "boolean"
},
"isDisplayedInSchedules": {
"type": "boolean"
},
"isHoursTaughtCountedInPrc": {
"type": "boolean"
},
"isHoursTaughtCountedInWorkloadPlan": {
"type": "boolean"
},
"isHoursTaughtExportedToPayroll": {
"type": "boolean"
},
"isInstructorConflictsEnabled": {
"type": "boolean"
},
"isLearnerConflictsEnabled": {
"type": "boolean"
},
"isPartOfAttendanceLists": {
"type": "boolean"
},
"isResourceConflictsEnabled": {
"type": "boolean"
},
"toSchedule": {
"type": "boolean"
}
}
},
"intervention": {
"type": "object",
"required": [
"id",
"activityType",
"actualDuration",
"startDateTime",
"endDateTime",
"isExam"
],
"properties": {
"id": {
"type": "integer"
},
"activityType": {
"$ref": "#/$defs/activityType"
},
"actualDuration": {
"type": "integer"
},
"startDateTime": {
"type": "string",
"format": "date-time"
},
"endDateTime": {
"type": "string",
"format": "date-time"
},
"field": {
"type": "object"
},
"isExam": {
"type": "boolean"
},
"interventionInstructors": {
"type": "array",
"items": {
"$ref": "#/$defs/interventionInstructor"
}
},
"interventionPedagogicalUnits": {
"type": "array"
},
"interventionPopulations": {
"type": "array"
},
"interventionPrograms": {
"type": "array"
},
"interventionResources": {
"type": "array"
},
"interventionStatus": {
"$ref": "#/$defs/interventionStatus"
},
"participations": {
"type": "array",
"items": {
"$ref": "#/$defs/participation"
}
},
"timezone": {
"$ref": "#/$defs/timezone"
}
}
}
}
}
Metadata
Release files for epita-ease 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| epita_ease-0.3.0.tar.gz | 8.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| epita_ease-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 19.4 kB
Release files / epita_ease-0.3.0.tar.gz
| Download URL | epita_ease-0.3.0.tar.gz |
|---|---|
| Size | 8.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a80b4f14824fae55c5f337bb1fe41fa2175dd7a55d2e90a03caf52a56a399b65
|
|
BLAKE2b-256 checksum How to use checksums |
418640b7456f0d50687983d172f91ff29563a2489651c2427701c5ba36259c6a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / epita_ease-0.3.0-py3-none-any.whl
| Download URL | epita_ease-0.3.0-py3-none-any.whl |
|---|---|
| Size | 10.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
774743ef0146552e13a1c0f0a034dbac89239765fcb29b8183d9485866ee00ff
|
|
BLAKE2b-256 checksum How to use checksums |
46de06e9eb4edbe882b355cab9f53d11d319b0935ae2e699512a822f06c984c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|