Content system

Proposals

Proposals deal exclusively with content which is submitted via the Call for Participation for inclusion in the official schedule.

Some proposals are handled through an anonymous review system, where they are anonymised and sent to a review panel to vote on.

class models.content.cfp.Proposal(**kwargs)[source]

A proposal for content submitted to us through the Call for Participation.

Proposals can be reviewed manually or through the anonymous review system. If a proposal is accepted, a ScheduleItem is created.

type: Mapped[Literal['talk', 'performance', 'workshop', 'youthworkshop', 'installation']][source]

The type of the proposal. This controls how the proposal is handled.

state: Mapped[Literal['new', 'edit', 'checked', 'rejected', 'anonymised', 'anon-blocked', 'manual-review', 'reviewed', 'accepted', 'finalised', 'withdrawn', 'conduct-blocked']][source]

The state of the proposal: where it is in the review process

user: Mapped[User][source]

The associated user, usually the person who submitted the proposal

accept()[source]

Accept the proposal, create a ScheduleItem, and issue the user a CfP voucher if needed.

Return type:

None

reject()[source]

Mark the proposal as rejected, and remove from the schedule if present.

Return type:

None

withdraw()[source]

Mark the proposal as withdrawn, and remove from the schedule if present.

Return type:

None

property is_editable: bool[source]

Whether this proposal can be edited by the submitter.

to_dict()[source]

JSON-compatible dict representation for CSV export.

Return type:

dict[str, Any]

models.content.cfp.ProposalState[source]

alias of Literal[‘new’, ‘edit’, ‘checked’, ‘rejected’, ‘anonymised’, ‘anon-blocked’, ‘manual-review’, ‘reviewed’, ‘accepted’, ‘finalised’, ‘withdrawn’, ‘conduct-blocked’]

models.content.cfp.ProposalType[source]

alias of Literal[‘talk’, ‘performance’, ‘workshop’, ‘youthworkshop’, ‘installation’]

Schedule

The schedule deals with the entire schedule for the event, including accepted CfP content, manually-added/booked official content, and attendee content.

class models.content.schedule.ScheduleItem(**kwargs)[source]

An item of content in the schedule.

This contains the details displayed in the schedule on the website. ScheduleItems are created for a Proposal if it’s submitted through the CfP and accepted, but they can also be created directly by villages.

type: Mapped[Literal['talk', 'performance', 'workshop', 'film', 'youthworkshop', 'installation', 'lightning']][source]

The type of the ScheduleItem, which controls how it’s displayed in the schedule

state: Mapped[Literal['published', 'unpublished', 'cancelled']][source]

The state of the ScheduleItem

user_id: Mapped[int][source]

The user who owns the ScheduleItem. An attendee ScheduleItem has an associated owner who can edit it (in addition to anyone who’s an admin for the scheduled village)

proposal_id: Mapped[int | None][source]

The proposal for this ScheduleItem. May be None in the case of attendee content.

official_content: Mapped[bool][source]

Whether this is official content or attendee content.

video_privacy: Mapped[Literal['public', 'review', 'none']][source]

Whether this should be recorded

availability: Mapped[list[ScheduleItemAvailability]][source]

The speaker’s availability to present this item - applies to all occurrences.

cancel()[source]

Mark this ScheduleItem as cancelled, as well as any occurrences.

Return type:

None

class models.content.schedule.Occurrence(**kwargs)[source]

An occurrence of a ScheduleItem. This indicates when and where a ScheduleItem will occur.

In future there may be multiple occurrences of a ScheduleItem, for example if the same workshop is presented twice, however this is not currently guaranteed to work.

manually_scheduled: Mapped[bool][source]

Prevents the automatic scheduler from trying to move this occurrence

potential_scheduled_slots: Mapped[list[PotentialScheduleOccurrence]][source]

Potential timeslots for this occurrence in a proposed schedule.

allowed_venues: Mapped[list[Venue]][source]

Venues this occurrence is allowed to be scheduled in.

is_valid_slot(start_time, venue, user=None)[source]

Check whether this occurrence can be scheduled in a given start_time and venue.

For village content, a user object should be passed in.

Return type:

bool

set_slot(start_time, venue, user=None)[source]

Set the start_time and venue, validating that this is allowed.

For village content, a user object should be passed in.

Return type:

None

cancel()[source]

Cancel this occurrence.

Return type:

None

property availability: list[ScheduleItemAvailability][source]

The speaker’s availability to present this occurrence.

Inherited from the ScheduleItem.

property valid_allowed_venues: list[Venue][source]

A list of venues this Occurrence is allowed to be scheduled in.

allowed_times(automatic)[source]

Return a mapping of Venue -> time range for when this occurrence is allowed to be scheduled. This is the intersection of speaker availability and venue TimeBlocks for this content type.

Return type:

dict[Venue, list[tuple[datetime, datetime]]]

property scheduled: bool[source]

Whether this occurrence has been scheduled

Venues

Venues are places on site (official or village-run) where content can be scheduled.

class models.content.venue.Venue(**kwargs)[source]

A location where content can be scheduled.

This can be an official talk stage, a village location, or any other place on site.

allows_attendee_content: Mapped[bool | None][source]

Whether this venue allows any attendee to schedule content in it. This is only true for official venues which allow attendee content (e.g. bar, lounge) and is currently null for village stages (which allow content to be scheduled by their admins)

class models.content.venue.TimeBlock(**kwargs)[source]

A block of time allocated in a venue for scheduling official content.

Villages can schedule content in their venues outside a TimeBlock, but all official content must be inside a TimeBlock.

Constraints:
  • There can only be one TimeBlock active for a venue at any time.

  • Each TimeBlock can only allow one content type in it.

  • TimeBlocks cannot span 5am, when the scheduling day ends.

type: Mapped[Literal['talk', 'performance', 'workshop', 'film', 'youthworkshop', 'installation', 'lightning']][source]

The type of item which can be scheduled in this TimeBlock

automatic: Mapped[bool][source]

Whether this block should be considered by the automatic scheduler