sidequest_common.schemas.events =============================== .. py:module:: sidequest_common.schemas.events .. autoapi-nested-parse:: Guild event, signup, and raid-chart schemas. ``class`` is a Python keyword, so the Python-side attribute is ``wow_class``; ``Field(alias=...)`` maps it to the wire name ``class`` in both directions. ``populate_by_name=True`` lets services also construct instances with the ``wow_class=`` keyword. Attributes ---------- .. autoapisummary:: sidequest_common.schemas.events.EVENT_KIND_EP sidequest_common.schemas.events.EVENT_KIND_LABELS sidequest_common.schemas.events.MAX_EVENT_EP sidequest_common.schemas.events.ROLE_KINDS Classes ------- .. autoapisummary:: sidequest_common.schemas.events.ChartUpdate sidequest_common.schemas.events.DiscordInterest sidequest_common.schemas.events.EventCounts sidequest_common.schemas.events.EventCreate sidequest_common.schemas.events.EventDetail sidequest_common.schemas.events.EventKind sidequest_common.schemas.events.EventSeriesCreate sidequest_common.schemas.events.EventSeriesSummary sidequest_common.schemas.events.EventSeriesUpdate sidequest_common.schemas.events.EventStatus sidequest_common.schemas.events.EventSummary sidequest_common.schemas.events.EventUpdate sidequest_common.schemas.events.SeriesRef sidequest_common.schemas.events.SeriesRule sidequest_common.schemas.events.Signup sidequest_common.schemas.events.SignupMember sidequest_common.schemas.events.SignupRole sidequest_common.schemas.events.SignupStatus sidequest_common.schemas.events.SignupUpsert sidequest_common.schemas.events.WowClass Functions --------- .. autoapisummary:: sidequest_common.schemas.events.event_ep Module Contents --------------- .. py:class:: ChartUpdate Bases: :py:obj:`pydantic.BaseModel` Body for ``PATCH /api/events/{id}/signups/{signup_id}`` (officer): place a signed player on the raid chart. .. py:attribute:: bench :type: bool | None :value: None .. py:attribute:: group :type: int | None .. py:class:: DiscordInterest Bases: :py:obj:`pydantic.BaseModel` Discord "Interested" clicks on an event's linked Discord event. Names are never shown for non-site accounts. .. py:attribute:: count :type: int .. py:attribute:: members :type: list[SignupMember] .. py:class:: EventCounts Bases: :py:obj:`pydantic.BaseModel` Headcounts for an event. ``tank``/``healer``/``dps``/``signed`` only count ``signed`` signups. ``interested`` is every Discord user who clicked "Interested" on the linked Discord event, regardless of whether they have a site account. .. py:attribute:: absent :type: int .. py:attribute:: dps :type: int .. py:attribute:: healer :type: int .. py:attribute:: interested :type: int .. py:attribute:: signed :type: int .. py:attribute:: tank :type: int .. py:attribute:: tentative :type: int .. py:class:: EventCreate Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/events`` (officer). .. py:attribute:: ends_at :type: datetime.datetime | None :value: None .. py:attribute:: ep_override :type: int | None .. py:attribute:: kind :type: EventKind .. py:attribute:: location :type: str .. py:attribute:: notes :type: str | None .. py:attribute:: size :type: int | None .. py:attribute:: starts_at :type: datetime.datetime .. py:attribute:: title :type: str .. py:class:: EventDetail Bases: :py:obj:`EventSummary` A single event with its full roster. ``signups``/``my_signup`` are empty, and ``discord_interest``/``away`` are ``None``, for anonymous visitors. .. py:attribute:: away :type: list[SignupMember] | None Members away (see ``AwayRangeIn``) on this event's start date, America/Chicago. ``None`` if anonymous. .. py:attribute:: discord_interest :type: DiscordInterest | None .. py:attribute:: my_signup :type: Signup | None .. py:attribute:: signups :type: list[Signup] .. py:class:: EventKind Bases: :py:obj:`enum.StrEnum` What kind of guild event this is. ``raid``/``dungeon`` are "role kinds": sign-ups need character/class/role. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: DUNGEON :value: 'dungeon' .. py:attribute:: LEVELING :value: 'leveling' .. py:attribute:: OTHER :value: 'other' .. py:attribute:: PVP :value: 'pvp' .. py:attribute:: RAID :value: 'raid' .. py:attribute:: SOCIAL :value: 'social' .. py:attribute:: TRANSMOG :value: 'transmog' .. py:class:: EventSeriesCreate Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/event-series`` (officer). Content and rule fields are flat (no ``rule`` nesting). .. py:attribute:: duration_minutes :type: int | None .. py:attribute:: ep_override :type: int | None .. py:attribute:: interval_weeks :type: int .. py:attribute:: kind :type: EventKind .. py:attribute:: location :type: str .. py:attribute:: notes :type: str | None .. py:attribute:: size :type: int | None .. py:attribute:: start_time :type: str .. py:attribute:: starts_on :type: datetime.date .. py:attribute:: timezone :type: str .. py:attribute:: title :type: str .. py:attribute:: until :type: datetime.date | None :value: None .. py:attribute:: weekdays :type: list[int] .. py:class:: EventSeriesSummary Bases: :py:obj:`pydantic.BaseModel` One repeating event series, as returned by ``GET/POST/PATCH /api/event-series``. ``ep``/``ep_override`` as on ``EventSummary``; occurrences copy ``ep_override``. .. py:attribute:: active :type: bool .. py:attribute:: ep :type: int .. py:attribute:: ep_override :type: int | None .. py:attribute:: id :type: uuid.UUID .. py:attribute:: kind :type: EventKind .. py:attribute:: location :type: str .. py:attribute:: model_config .. py:attribute:: next_starts_at :type: datetime.datetime | None .. py:attribute:: notes :type: str | None .. py:attribute:: rule :type: SeriesRule .. py:attribute:: size :type: int | None .. py:attribute:: title :type: str .. py:class:: EventSeriesUpdate Bases: :py:obj:`pydantic.BaseModel` Body for ``PATCH /api/event-series/{id}`` (officer). Only present fields change; all are optional. .. py:attribute:: duration_minutes :type: int | None .. py:attribute:: ep_override :type: int | None .. py:attribute:: interval_weeks :type: int | None :value: None .. py:attribute:: kind :type: EventKind | None :value: None .. py:attribute:: location :type: str | None .. py:attribute:: notes :type: str | None .. py:attribute:: size :type: int | None .. py:attribute:: start_time :type: str | None :value: None .. py:attribute:: starts_on :type: datetime.date | None :value: None .. py:attribute:: timezone :type: str | None :value: None .. py:attribute:: title :type: str | None .. py:attribute:: until :type: datetime.date | None :value: None .. py:attribute:: weekdays :type: list[int] | None :value: None .. py:class:: EventStatus Bases: :py:obj:`enum.StrEnum` Lifecycle of a scheduled guild event. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: CANCELLED :value: 'cancelled' .. py:attribute:: COMPLETED :value: 'completed' .. py:attribute:: SCHEDULED :value: 'scheduled' .. py:class:: EventSummary Bases: :py:obj:`pydantic.BaseModel` One event as returned in list views. ``location`` is ``""`` and ``size`` ``None`` for Discord-created events. ``ep`` is what attending awards; ``ep_override`` is the officer-set value behind it (``None``: the kind's preset). ``notes``/``counts`` are ``None`` for anonymous visitors (no session, no bot ``X-API-Key``). .. py:attribute:: counts :type: EventCounts | None .. py:attribute:: ends_at :type: datetime.datetime | None .. py:attribute:: ep :type: int .. py:attribute:: ep_override :type: int | None .. py:attribute:: id :type: uuid.UUID .. py:attribute:: kind :type: EventKind .. py:attribute:: location :type: str .. py:attribute:: model_config .. py:attribute:: notes :type: str | None .. py:attribute:: series :type: SeriesRef | None .. py:attribute:: size :type: int | None .. py:attribute:: starts_at :type: datetime.datetime .. py:attribute:: status :type: EventStatus .. py:attribute:: title :type: str .. py:class:: EventUpdate Bases: :py:obj:`pydantic.BaseModel` Body for ``PATCH /api/events/{id}`` (officer). Only present fields change; ``ends_at: null`` clears the end. ``ep_override: null`` goes back to the kind's EP preset. ``ends_at`` vs ``starts_at`` is checked against the stored event by the service when only one of them is sent. .. py:attribute:: ends_at :type: datetime.datetime | None :value: None .. py:attribute:: ep_override :type: int | None .. py:attribute:: kind :type: EventKind | None :value: None .. py:attribute:: location :type: str | None .. py:attribute:: notes :type: str | None .. py:attribute:: size :type: int | None .. py:attribute:: starts_at :type: datetime.datetime | None :value: None .. py:attribute:: status :type: EventStatus | None :value: None .. py:attribute:: title :type: str | None .. py:class:: SeriesRef Bases: :py:obj:`pydantic.BaseModel` The minimal repeating-event schedule, attached to ``EventSummary`` for non-detached series occurrences. ``None`` on ``EventSummary.series`` for one-off events and occurrences an officer has edited/deleted individually (``series_detached``). .. py:attribute:: id :type: uuid.UUID .. py:attribute:: interval_weeks :type: int .. py:attribute:: model_config .. py:attribute:: start_time :type: str .. py:attribute:: timezone :type: str .. py:attribute:: weekdays :type: list[int] .. py:class:: SeriesRule Bases: :py:obj:`pydantic.BaseModel` A repeating schedule rule, nested on ``EventSeriesSummary``. ``start_time`` is ``"HH:MM"`` 24-hour local time. .. py:attribute:: duration_minutes :type: int | None .. py:attribute:: interval_weeks :type: int .. py:attribute:: start_time :type: str .. py:attribute:: starts_on :type: datetime.date .. py:attribute:: timezone :type: str .. py:attribute:: until :type: datetime.date | None .. py:attribute:: weekdays :type: list[int] .. py:class:: Signup Bases: :py:obj:`pydantic.BaseModel` One member's signup for an event, including the officer-assigned raid chart slot. .. py:attribute:: bench :type: bool .. py:attribute:: character :type: str | None .. py:attribute:: comment :type: str | None .. py:attribute:: group :type: int | None .. py:attribute:: id :type: uuid.UUID .. py:attribute:: member :type: SignupMember .. py:attribute:: model_config .. py:attribute:: role :type: SignupRole | None .. py:attribute:: status :type: SignupStatus .. py:attribute:: updated_at :type: datetime.datetime .. py:attribute:: wow_class :type: WowClass | None .. py:class:: SignupMember Bases: :py:obj:`pydantic.BaseModel` The public-facing slice of a signed-up member. .. py:attribute:: avatar_url :type: str | None .. py:attribute:: display_name :type: str .. py:attribute:: model_config .. py:class:: SignupRole Bases: :py:obj:`enum.StrEnum` What role a signed-up character plays. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: DPS :value: 'dps' .. py:attribute:: HEALER :value: 'healer' .. py:attribute:: TANK :value: 'tank' .. py:class:: SignupStatus Bases: :py:obj:`enum.StrEnum` Whether a member is coming. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: ABSENT :value: 'absent' .. py:attribute:: SIGNED :value: 'signed' .. py:attribute:: TENTATIVE :value: 'tentative' .. py:class:: SignupUpsert Bases: :py:obj:`pydantic.BaseModel` Body for ``PUT /api/events/{id}/signup`` (member). ``character``/``class``/``role`` are required (400 if missing) when the event's kind is ``raid``/``dungeon``; other kinds accept a bare RSVP. .. py:attribute:: character :type: str | None .. py:attribute:: comment :type: str | None .. py:attribute:: model_config .. py:attribute:: role :type: SignupRole | None :value: None .. py:attribute:: status :type: SignupStatus .. py:attribute:: wow_class :type: WowClass | None .. py:class:: WowClass Bases: :py:obj:`enum.StrEnum` Playable WoW classes. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: DRUID :value: 'druid' .. py:attribute:: HUNTER :value: 'hunter' .. py:attribute:: MAGE :value: 'mage' .. py:attribute:: PALADIN :value: 'paladin' .. py:attribute:: PRIEST :value: 'priest' .. py:attribute:: ROGUE :value: 'rogue' .. py:attribute:: SHAMAN :value: 'shaman' .. py:attribute:: WARLOCK :value: 'warlock' .. py:attribute:: WARRIOR :value: 'warrior' .. py:function:: event_ep(kind: str, ep_override: int | None) -> int The EP an event awards: the officer's override, else its kind's preset. .. py:data:: EVENT_KIND_EP :type: dict[EventKind, int] EP (effort points) for attending an event of each kind, unless an officer overrides it on the event. A raid boss kill is worth 10 EP, so these keep guild nights a small nudge next to raiding. A raid's 10 is its on-time and full-night attendance bonus; boss kills earn their own EP on top. .. py:data:: EVENT_KIND_LABELS :type: dict[EventKind, str] .. py:data:: MAX_EVENT_EP :value: 50 .. py:data:: ROLE_KINDS