sidequest_common.schemas.events#

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#

EVENT_KIND_EP

EP (effort points) for attending an event of each kind, unless an officer overrides it on the event.

EVENT_KIND_LABELS

MAX_EVENT_EP

ROLE_KINDS

Classes#

ChartUpdate

Body for PATCH /api/events/{id}/signups/{signup_id} (officer): place a signed player on the raid chart.

DiscordInterest

Discord "Interested" clicks on an event's linked Discord event. Names are never shown for non-site accounts.

EventCounts

Headcounts for an event. tank/healer/dps/signed only count signed signups.

EventCreate

Body for POST /api/events (officer).

EventDetail

A single event with its full roster.

EventKind

What kind of guild event this is. raid/dungeon are "role kinds": sign-ups need character/class/role.

EventSeriesCreate

Body for POST /api/event-series (officer). Content and rule fields are flat (no rule nesting).

EventSeriesSummary

One repeating event series, as returned by GET/POST/PATCH /api/event-series.

EventSeriesUpdate

Body for PATCH /api/event-series/{id} (officer). Only present fields change; all are optional.

EventStatus

Lifecycle of a scheduled guild event.

EventSummary

One event as returned in list views. location is "" and size None for Discord-created events.

EventUpdate

Body for PATCH /api/events/{id} (officer). Only present fields change; ends_at: null clears the end.

SeriesRef

The minimal repeating-event schedule, attached to EventSummary for non-detached series occurrences.

SeriesRule

A repeating schedule rule, nested on EventSeriesSummary. start_time is "HH:MM" 24-hour local time.

Signup

One member's signup for an event, including the officer-assigned raid chart slot.

SignupMember

The public-facing slice of a signed-up member.

SignupRole

What role a signed-up character plays.

SignupStatus

Whether a member is coming.

SignupUpsert

Body for PUT /api/events/{id}/signup (member).

WowClass

Playable WoW classes.

Functions#

event_ep(→ int)

The EP an event awards: the officer's override, else its kind's preset.

Module Contents#

class sidequest_common.schemas.events.ChartUpdate#

Bases: pydantic.BaseModel

Body for PATCH /api/events/{id}/signups/{signup_id} (officer): place a signed player on the raid chart.

bench: bool | None = None#
group: int | None#
class sidequest_common.schemas.events.DiscordInterest#

Bases: pydantic.BaseModel

Discord “Interested” clicks on an event’s linked Discord event. Names are never shown for non-site accounts.

count: int#
members: list[SignupMember]#
class sidequest_common.schemas.events.EventCounts#

Bases: 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.

absent: int#
dps: int#
healer: int#
interested: int#
signed: int#
tank: int#
tentative: int#
class sidequest_common.schemas.events.EventCreate#

Bases: pydantic.BaseModel

Body for POST /api/events (officer).

ends_at: datetime.datetime | None = None#
ep_override: int | None#
kind: EventKind#
location: str#
notes: str | None#
size: int | None#
starts_at: datetime.datetime#
title: str#
class sidequest_common.schemas.events.EventDetail#

Bases: EventSummary

A single event with its full roster.

signups/my_signup are empty, and discord_interest/away are None, for anonymous visitors.

away: list[SignupMember] | None#

Members away (see AwayRangeIn) on this event’s start date, America/Chicago. None if anonymous.

discord_interest: DiscordInterest | None#
my_signup: Signup | None#
signups: list[Signup]#
class sidequest_common.schemas.events.EventKind#

Bases: 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.

DUNGEON = 'dungeon'#
LEVELING = 'leveling'#
OTHER = 'other'#
PVP = 'pvp'#
RAID = 'raid'#
SOCIAL = 'social'#
TRANSMOG = 'transmog'#
class sidequest_common.schemas.events.EventSeriesCreate#

Bases: pydantic.BaseModel

Body for POST /api/event-series (officer). Content and rule fields are flat (no rule nesting).

duration_minutes: int | None#
ep_override: int | None#
interval_weeks: int#
kind: EventKind#
location: str#
notes: str | None#
size: int | None#
start_time: str#
starts_on: datetime.date#
timezone: str#
title: str#
until: datetime.date | None = None#
weekdays: list[int]#
class sidequest_common.schemas.events.EventSeriesSummary#

Bases: 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.

active: bool#
ep: int#
ep_override: int | None#
id: uuid.UUID#
kind: EventKind#
location: str#
model_config#
next_starts_at: datetime.datetime | None#
notes: str | None#
rule: SeriesRule#
size: int | None#
title: str#
class sidequest_common.schemas.events.EventSeriesUpdate#

Bases: pydantic.BaseModel

Body for PATCH /api/event-series/{id} (officer). Only present fields change; all are optional.

duration_minutes: int | None#
ep_override: int | None#
interval_weeks: int | None = None#
kind: EventKind | None = None#
location: str | None#
notes: str | None#
size: int | None#
start_time: str | None = None#
starts_on: datetime.date | None = None#
timezone: str | None = None#
title: str | None#
until: datetime.date | None = None#
weekdays: list[int] | None = None#
class sidequest_common.schemas.events.EventStatus#

Bases: enum.StrEnum

Lifecycle of a scheduled guild event.

Initialize self. See help(type(self)) for accurate signature.

CANCELLED = 'cancelled'#
COMPLETED = 'completed'#
SCHEDULED = 'scheduled'#
class sidequest_common.schemas.events.EventSummary#

Bases: 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).

counts: EventCounts | None#
ends_at: datetime.datetime | None#
ep: int#
ep_override: int | None#
id: uuid.UUID#
kind: EventKind#
location: str#
model_config#
notes: str | None#
series: SeriesRef | None#
size: int | None#
starts_at: datetime.datetime#
status: EventStatus#
title: str#
class sidequest_common.schemas.events.EventUpdate#

Bases: 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.

ends_at: datetime.datetime | None = None#
ep_override: int | None#
kind: EventKind | None = None#
location: str | None#
notes: str | None#
size: int | None#
starts_at: datetime.datetime | None = None#
status: EventStatus | None = None#
title: str | None#
class sidequest_common.schemas.events.SeriesRef#

Bases: 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).

id: uuid.UUID#
interval_weeks: int#
model_config#
start_time: str#
timezone: str#
weekdays: list[int]#
class sidequest_common.schemas.events.SeriesRule#

Bases: pydantic.BaseModel

A repeating schedule rule, nested on EventSeriesSummary. start_time is "HH:MM" 24-hour local time.

duration_minutes: int | None#
interval_weeks: int#
start_time: str#
starts_on: datetime.date#
timezone: str#
until: datetime.date | None#
weekdays: list[int]#
class sidequest_common.schemas.events.Signup#

Bases: pydantic.BaseModel

One member’s signup for an event, including the officer-assigned raid chart slot.

bench: bool#
character: str | None#
comment: str | None#
group: int | None#
id: uuid.UUID#
member: SignupMember#
model_config#
role: SignupRole | None#
status: SignupStatus#
updated_at: datetime.datetime#
wow_class: WowClass | None#
class sidequest_common.schemas.events.SignupMember#

Bases: pydantic.BaseModel

The public-facing slice of a signed-up member.

avatar_url: str | None#
display_name: str#
model_config#
class sidequest_common.schemas.events.SignupRole#

Bases: enum.StrEnum

What role a signed-up character plays.

Initialize self. See help(type(self)) for accurate signature.

DPS = 'dps'#
HEALER = 'healer'#
TANK = 'tank'#
class sidequest_common.schemas.events.SignupStatus#

Bases: enum.StrEnum

Whether a member is coming.

Initialize self. See help(type(self)) for accurate signature.

ABSENT = 'absent'#
SIGNED = 'signed'#
TENTATIVE = 'tentative'#
class sidequest_common.schemas.events.SignupUpsert#

Bases: 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.

character: str | None#
comment: str | None#
model_config#
role: SignupRole | None = None#
status: SignupStatus#
wow_class: WowClass | None#
class sidequest_common.schemas.events.WowClass#

Bases: enum.StrEnum

Playable WoW classes.

Initialize self. See help(type(self)) for accurate signature.

DRUID = 'druid'#
HUNTER = 'hunter'#
MAGE = 'mage'#
PALADIN = 'paladin'#
PRIEST = 'priest'#
ROGUE = 'rogue'#
SHAMAN = 'shaman'#
WARLOCK = 'warlock'#
WARRIOR = 'warrior'#
sidequest_common.schemas.events.event_ep(kind: str, ep_override: int | None) → int#

The EP an event awards: the officer’s override, else its kind’s preset.

sidequest_common.schemas.events.EVENT_KIND_EP: 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.

sidequest_common.schemas.events.EVENT_KIND_LABELS: dict[EventKind, str]#
sidequest_common.schemas.events.MAX_EVENT_EP = 50#
sidequest_common.schemas.events.ROLE_KINDS#