sidequest_common.schemas.attendance#

Attendance: marking who came to an event, bot-reported voice time, and the GM attendance report.

See sidequest_api.lib.attendance for the SQL conditions attended/no-show status feed into.

Classes#

AttendanceDetail

GET/PUT /api/events/{id}/attendance (officer): the marking screen for one event.

AttendanceEventSummary

One past event, as listed on the attendance tab's event picker.

AttendanceMark

Body for PUT /api/events/{id}/attendance (officer). Sets attendance_taken_at to now.

AttendanceMarkEntry

One sign-up's Came/No-show decision.

AttendanceRange

A reporting window for GET /api/attendance/report and /trends.

AttendanceReport

GET /api/attendance/report (GM).

AttendanceSignup

One sign-up on the attendance marking screen, with the bot's reported voice time.

AttendanceTrendPoint

One week's attendance on the trend chart.

AttendanceTrends

GET /api/attendance/trends (GM): weekly attendance over the chosen range, oldest week first.

MemberAttendanceRow

One member's line on GET /api/attendance/report.

VoicePresenceEntry

One Discord member's cumulative voice minutes for an event, so far.

VoicePresenceReport

Bot -> API: cumulative voice minutes per member for one event, so far.

WalkInCandidate

A guild member not currently signed up for the event, offered as a walk-in on the marking screen.

WalkInCreate

A member who came without signing up. character/class/role are required for raid/dungeon events.

Module Contents#

class sidequest_common.schemas.attendance.AttendanceDetail#

Bases: pydantic.BaseModel

GET/PUT /api/events/{id}/attendance (officer): the marking screen for one event.

event: AttendanceEventSummary#
signups: list[AttendanceSignup]#
walk_in_candidates: list[WalkInCandidate]#
class sidequest_common.schemas.attendance.AttendanceEventSummary#

Bases: pydantic.BaseModel

One past event, as listed on the attendance tab’s event picker.

attendance_taken_at: datetime.datetime | None#
id: uuid.UUID#
kind: sidequest_common.schemas.events.EventKind#
needs_attendance: bool#
starts_at: datetime.datetime#
status: sidequest_common.schemas.events.EventStatus#
title: str#
class sidequest_common.schemas.attendance.AttendanceMark#

Bases: pydantic.BaseModel

Body for PUT /api/events/{id}/attendance (officer). Sets attendance_taken_at to now.

Sign-ups not listed in entries are left as-is (unmarked, unless a previous save already marked them): tentative/absent sign-ups default to not marked.

entries: list[AttendanceMarkEntry]#
walk_ins: list[WalkInCreate]#
class sidequest_common.schemas.attendance.AttendanceMarkEntry#

Bases: pydantic.BaseModel

One sign-up’s Came/No-show decision.

attended: bool#
signup_id: uuid.UUID#
class sidequest_common.schemas.attendance.AttendanceRange#

Bases: enum.StrEnum

A reporting window for GET /api/attendance/report and /trends.

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

ALL_TIME = 'all_time'#
LAST_30 = 'last_30'#
SEASON = 'season'#
class sidequest_common.schemas.attendance.AttendanceReport#

Bases: pydantic.BaseModel

GET /api/attendance/report (GM).

raids_only: bool#
range: AttendanceRange#
rows: list[MemberAttendanceRow]#
class sidequest_common.schemas.attendance.AttendanceSignup#

Bases: pydantic.BaseModel

One sign-up on the attendance marking screen, with the bot’s reported voice time.

attended: bool | None#
avatar_url: str | None#
character: str | None#
display_name: str#
is_walk_in: bool#
member_id: int#
model_config#
role: sidequest_common.schemas.events.SignupRole | None#
signup_id: uuid.UUID#
status: sidequest_common.schemas.events.SignupStatus#
suggested_attended: bool#
voice_minutes: int#
wow_class: sidequest_common.schemas.events.WowClass | None#
class sidequest_common.schemas.attendance.AttendanceTrendPoint#

Bases: pydantic.BaseModel

One week’s attendance on the trend chart.

attendees: int#
show_rate: float#
signed_up: int#
week_start: datetime.date#
class sidequest_common.schemas.attendance.AttendanceTrends#

Bases: pydantic.BaseModel

GET /api/attendance/trends (GM): weekly attendance over the chosen range, oldest week first.

points: list[AttendanceTrendPoint]#
raids_only: bool#
range: AttendanceRange#
class sidequest_common.schemas.attendance.MemberAttendanceRow#

Bases: pydantic.BaseModel

One member’s line on GET /api/attendance/report.

attendance_rate: float#
avatar_url: str | None#
came: int#
display_name: str#
last_attended: datetime.datetime | None#
member_id: int#
no_shows: int#
signed_up: int#
walk_ins: int#
class sidequest_common.schemas.attendance.VoicePresenceEntry#

Bases: pydantic.BaseModel

One Discord member’s cumulative voice minutes for an event, so far.

discord_id: str#
minutes: int#
class sidequest_common.schemas.attendance.VoicePresenceReport#

Bases: pydantic.BaseModel

Bot -> API: cumulative voice minutes per member for one event, so far.

Idempotent: the API stores max(existing, reported) per discord_id listed (never an increment, and never lowers a stored total), so the bot can push repeatedly – including after its own in-memory counter has reset on restart – without double-counting or regressing a member’s total.

entries: list[VoicePresenceEntry]#
event_id: uuid.UUID#
class sidequest_common.schemas.attendance.WalkInCandidate#

Bases: pydantic.BaseModel

A guild member not currently signed up for the event, offered as a walk-in on the marking screen.

avatar_url: str | None#
display_name: str#
member_id: int#
class sidequest_common.schemas.attendance.WalkInCreate#

Bases: pydantic.BaseModel

A member who came without signing up. character/class/role are required for raid/dungeon events.

character: str | None#
member_id: int#
model_config#
role: sidequest_common.schemas.events.SignupRole | None = None#
wow_class: sidequest_common.schemas.events.WowClass | None#