EASE: EPITA Auriga Schedule Exporter
How to
Using pipx (recommended)
Install EASE with pipx:
pipx install https://github.com/lacaulac/ease/releases/latest/download/ease-0.2.0-py3-none-any.whl
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.2.1
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.2.1.tar.gz | 7.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| epita_ease-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.4 kB
Release files / epita_ease-0.2.1.tar.gz
| Download URL | epita_ease-0.2.1.tar.gz |
|---|---|
| Size | 7.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0decb7ccf1fb0873a7d236364fa6d81b8c29ca970e2474b8b61ae4a4201b45e0
|
|
BLAKE2b-256 checksum How to use checksums |
7fa109342b33b019eeeeb4dfb6c10ea073fe8e053e0103a43e88df2cdf873596
|
| 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.2.1-py3-none-any.whl
| Download URL | epita_ease-0.2.1-py3-none-any.whl |
|---|---|
| Size | 8.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ee03dae29d2d62269acbb71847c130e48c49e4d34ef706772317a674be5905b4
|
|
BLAKE2b-256 checksum How to use checksums |
707e60ff921d580325943a73a151725a964ba74225f51d638e1ba03d2f79aec2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|