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.3.0

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.3.0
File Size Uploaded
epita_ease-0.3.0.tar.gz 8.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for epita-ease 0.3.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.3

2 release files

0.2.2

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