Skip to main content

EASE: EPITA Auriga Schedule Exporter

How to

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

  1. Connects to auriga.epita.fr
  2. Gets redirected into oblivion for a bit
  3. Inputs credentials (you can do that manually too)
  4. Logs in
  5. Hijacks the auth token
  6. Exports the calendar's JSON for the current year
  7. Converts it into a .ics file
  8. ???
  9. 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.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for epita-ease 0.2.2
File Size Uploaded
epita_ease-0.2.2.tar.gz 6.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for epita-ease 0.2.2
File Interpreter ABI Platform
epita_ease-0.2.2-py3-none-any.whl Python 3 none any Details

Total release size: 15.3 kB

Release files / epita_ease-0.2.2.tar.gz

Download URL epita_ease-0.2.2.tar.gz
Size 6.9 kB
Tags Source
SHA-256 checksum
How to use checksums
7e838de34d8b70b5ee72624592bc23d4975a759f63f6563b6b1bcee8c6ac11b7
BLAKE2b-256 checksum
How to use checksums
1ff655de5b3c211b569b9a8b043cd6846823b0bd59e4e6bc45908297786a3843
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.2-py3-none-any.whl

Download URL epita_ease-0.2.2-py3-none-any.whl
Size 8.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
de25b6599f173a5874c293bc0783dbe9f995edc25d327184c381656e5b7b3017
BLAKE2b-256 checksum
How to use checksums
a32ca38c73e9620575fe7fee1f510b1786466db4b6fac51853b5e243357dca29
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.8

Release history Release notifications | RSS feed

0.3.0

2 release files

0.2.3

2 release files

This release

0.2.2 This release

2 release files

0.2.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page