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

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.3
File Size Uploaded
epita_ease-0.2.3.tar.gz 6.9 kB Details

Built distribution (wheel)

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

Total release size: 15.3 kB

Release files / epita_ease-0.2.3.tar.gz

Download URL epita_ease-0.2.3.tar.gz
Size 6.9 kB
Tags Source
SHA-256 checksum
How to use checksums
05f0c16b0a3f66b7b1c35ccaad8176d46ac94614310b200ec37a3467d6f837af
BLAKE2b-256 checksum
How to use checksums
f5c23a53885b20c5cc4e70a573cbd6093e76fcf59bedeaa22ef4f84d99206d68
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.3-py3-none-any.whl

Download URL epita_ease-0.2.3-py3-none-any.whl
Size 8.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d3bfee7bb87c669714a806efbeb58d6042e65c9e4c54b2ae077fec58aaf74c48
BLAKE2b-256 checksum
How to use checksums
2d2c073110e74dcb9b8b09b3e7c961707b0cc781b0d529f7e8e4d2e4249935be
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

This release

0.2.3 This release

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