granicus_archiver.web.views

class granicus_archiver.web.views.GlobalContext[source]

Bases: TypedDict

Context data for all templated views

Navigation links

page_title: str

Title of the page

class granicus_archiver.web.views.ContextT

Type variable for template context data

alias of TypeVar(‘ContextT’, bound=GlobalContext)

granicus_archiver.web.views.ClipIdOrNoneStr

Type variable for a clip id

alias of CLIP_ID | Literal[‘None’] | Literal[‘NoClip’]

granicus_archiver.web.views.GuidOrNoneStr

Type variable for a guid

alias of GUID | Literal[‘None’] | Literal[‘NoClip’]

granicus_archiver.web.views.read_only_guard(func)[source]

Decorator to prevent modification of data when in read_only mode

granicus_archiver.web.views.with_data_file_lock(func)[source]

Decorator to hold the DataFileLock within wrapped the function

granicus_archiver.web.views.is_truthy(value: str | bool | None) bool[source]

Check if the value is truthy

Parameters:

value (str | bool | None)

Return type:

bool

granicus_archiver.web.views.parse_date(value: str | None) date | None[source]

Parse a date from a string

Parameters:

value (str | None)

Return type:

date | None

granicus_archiver.web.views.is_clip_hidden(request: Request, clip_or_id: Clip | CLIP_ID | None | Literal[_DoesNotExistEnum.DoesNotExist]) bool[source]

Check if a clip is hidden based on the app config

Parameters:
  • request (Request)

  • clip_or_id (Clip | CLIP_ID | None | Literal[_DoesNotExistEnum.DoesNotExist])

Return type:

bool

granicus_archiver.web.views.check_clip_hidden(request: Request, clip_or_id: Clip | CLIP_ID) None[source]

Check if a clip is hidden and raise a 404 if it is

Parameters:
Return type:

None

async granicus_archiver.web.views.healthcheck(request: Request) Response[source]

Health check endpoint

Parameters:

request (Request)

Return type:

Response

async granicus_archiver.web.views.clip_webvtt(request: Request) Response | StreamResponse[source]

View to display a webvtt file for a clip

Parameters:

request (Request)

Return type:

Response | StreamResponse

class granicus_archiver.web.views.AbstractView[source]

Bases: ABC, Generic[ContextT]

Abstract base class for views that render templates

abstract classmethod get_template_name() str[source]

Get the template name for this view

Return type:

str

abstract async get_context_data() ContextT[source]

Get the context data for this view

Return type:

ContextT

abstract async render_to_response(context: ContextT) Response[source]

Render the response for this view

Parameters:

context (ContextT)

Return type:

Response

class granicus_archiver.web.views.TemplatedView(request: None)[source]

Bases: View, Generic[ContextT], AbstractView[ContextT]

Base class for views that render templates

Parameters:

request (None)

get_config() Config[source]

Get the granicus_archiver.config.Config object

Return type:

Config

classmethod get_template_name() str[source]

Get the template name for this view

Return type:

str

async render_to_response(context: ContextT) Response[source]

Render the templated response

Parameters:

context (ContextT)

Return type:

Response

async get() Response[source]

Handler for GET requests

Return type:

Response

class granicus_archiver.web.views.ListFilterContext[source]

Bases: TypedDict, Generic

Context data for list views with filters

view_unassigned: bool

Whether to view unassigned items

all_categories: list[CatT]

All possible categories

current_category: CatT | None

The current category

filter_by_date: bool

Whether to filter by date

start_date: date | None

The start date for filtering

end_date: date | None

The end date for filtering

hidden_clip_list_filters: Sequence[ListFilterField]

List of list filter fields to hide in the UI

class granicus_archiver.web.views.ClipListContext[source]

Bases: GlobalContext

Template context for ClipListView

clip_dict: dict[CLIP_ID, Clip]

Mapping of Clip instances by their id

clips: Iterable[Clip]

Iterable of Clip instances

clip_guids: dict[CLIP_ID, GUID | Literal['None'] | Literal['NoClip']]

Mapping of clip ids to their associated legistar item guids. A value of None or NoClip indicates no associated legistar item.

paginator: Paginator[tuple[CLIP_ID, Clip]]

Paginator instance for clip_dict

filter_context: ListFilterContext[Location]

Filter context data

class granicus_archiver.web.views.ClipListView(request: Request)[source]

Bases: TemplatedView[ClipListContext]

List view for granicus_archiver.model.Clip objects

Parameters:

request (web.Request)

parse_filter_context() ListFilterContext[Location][source]

Parse the filter context from the request’s query parameters

Return type:

ListFilterContext[Location]

get_filtered_items(clips: Sequence[Clip]) Sequence[Clip][source]

Get items filtered by the filter_context

Parameters:

clips (Sequence[Clip])

Return type:

Sequence[Clip]

async get_context_data() ClipListContext[source]

Get the context data for this view

Return type:

ClipListContext

class granicus_archiver.web.views.ClipViewContext[source]

Bases: GlobalContext

Template context for ClipViewBase

clip: Clip

The Clip instance being viewed

legistar_item: DetailPageResult | Literal[_DoesNotExistEnum.DoesNotExist] | None

The associated legistar item, or None if no match is found

legistar_guid: GUID | Literal[_DoesNotExistEnum.DoesNotExist] | None

The associated legistar item guid, if one exists

legistar_rguid_item: RGuidDetailResult | Literal[_DoesNotExistEnum.DoesNotExist] | None

The associated real-guid legistar item, or None if no match is found

legistar_rguid_item_id: REAL_GUID | Literal[_DoesNotExistEnum.DoesNotExist] | None

Item id for legistar_rguid_item

class granicus_archiver.web.views.ClipViewBase(request: Request)[source]

Bases: TemplatedView[ClipViewContextT]

Base class for views that display a single Clip instance

Parameters:

request (web.Request)

async get_context_data() ClipViewContext[source]

Get the context data for this view

Return type:

ClipViewContext

class granicus_archiver.web.views.ClipView(request: Request)[source]

Bases: ClipViewBase

View for a single Clip instance

Parameters:

request (web.Request)

class granicus_archiver.web.views.ClipEditForm[source]

Bases: TypedDict

Form data for ClipEditView

guid: GUID | Literal['None'] | Literal['NoClip']

The associated legistar item guid or None. A special value of "NoClip" will specify NoClip for the item.

real_guid: REAL_GUID | Literal['None'] | Literal['NoClip']

The associated real-guid legistar item guid or None. A special value of "NoClip" will specify NoClip for the item.

class granicus_archiver.web.views.ClipEditViewContext[source]

Bases: ClipViewContext

Template context for ClipEditView

form_data: ClipEditForm

The form data

item_options: Iterable[DetailPageResult]

An iterable of possible choices to assign to the clip

rguid_item_options: Iterable[RGuidDetailResult]

An iterable of possible choices to assign to the clip (real-guid)

class granicus_archiver.web.views.ClipEditView(request: Request)[source]

Bases: ClipViewBase[ClipEditViewContext]

Edit view for a single Clip instance

Parameters:

request (web.Request)

async get_context_data() ClipEditViewContext[source]

Get the context data for this view

Return type:

ClipEditViewContext

class granicus_archiver.web.views.LegistarListFilterContext[source]

Bases: ListFilterContext[Category]

Filter context data for legistar items

agenda_status: AgendaStatus | None

The agenda status to filter by

minutes_status: MinutesStatus | None

The minutes status to filter by

agenda_status_items: Iterable[AgendaStatus]

All possible agenda status items

minutes_status_items: Iterable[MinutesStatus]

All possible minutes status items

class granicus_archiver.web.views.LegistarSearchForm[source]

Bases: TypedDict

Form data for searching legistar items

search: str

The search term

max_results: SearchResultCount

The maximum number of search results to return

max_results_options: Sequence[SearchResultCount]

All possible options for max_results

class granicus_archiver.web.views.LegistarItemsContext[source]

Bases: GlobalContext, Generic

Template context for LegistarItemsViewBase

item_dict: dict[IdT, ItemT]

Mapping of items by their id

item_clip_ids: dict[IdT, CLIP_ID | Literal['None'] | Literal['NoClip']]

Mapping of item ids to their associated clip ids

item_view_name: str

The name of the view to display an individual item

item_edit_view_name: str

The name of the view to edit an individual item

paginator: Paginator[tuple[IdT, ItemT]]

Paginator instance for item_dict

filter_context: LegistarListFilterContext

Filter context data

search_form: LegistarSearchForm | None

The search form data, if applicable

search_item_scores: dict[IdT, float] | None

Mapping of item ids to their search scores, if applicable

search_item_results: dict[IdT, SearchResult] | None

Mapping of item ids to their search results, if applicable

class granicus_archiver.web.views.LegistarItemsViewBase(request: Request)[source]

Bases: TemplatedView[LegistarItemsContext], Generic

Base class for views that display a list of legistar items

Parameters:

request (web.Request)

async get() Response[source]

Handler for GET requests

Return type:

Response

get_filtered_items(item_dict: dict[IdT, ItemT]) dict[IdT, ItemT][source]

Get items filtered by the filter_context

Parameters:

item_dict (dict[IdT, ItemT])

Return type:

dict[IdT, ItemT]

async get_context_data() LegistarItemsContext[IdT, ItemT][source]

Get the context data for this view

Return type:

LegistarItemsContext[IdT, ItemT]

class granicus_archiver.web.views.LegistarItemsView(request: Request)[source]

Bases: LegistarItemsViewBase[GUID, DetailPageResult]

A list view of DetailPageResult instances

Parameters:

request (web.Request)

class granicus_archiver.web.views.RGuidLegistarItemsView(request: Request)[source]

Bases: LegistarItemsViewBase[REAL_GUID, RGuidDetailResult]

A list view of RGuidDetailResult instances

Parameters:

request (web.Request)

class granicus_archiver.web.views.LegistarItemFormData[source]

Bases: TypedDict

Form data for LItemChangeView

clip_id: CLIP_ID | Literal['None'] | Literal['NoClip']

The associated clip id or None

next_url: URL | str

The URL to redirect to after submitting the form

class granicus_archiver.web.views._ItemContext[source]

Bases: GlobalContext, Generic

Template context for LItemViewBase

legistar_type: Literal['legistar', 'legistar_rguid']

The type of legistar data

item: ItemT

The item being viewed

item_id: IdT

The id of the item

files: LegistarFiles | None

The files associated with the item

file_iter: Iterable[tuple[LegistarFileUID, AbstractFile]]

An iterable of AbstractFile instances

file_static_key: Literal['assets', 'granicus', 'legistar', 'legistar_rguid']

The key for the item assets in StaticUrlRoots

clip_id: CLIP_ID | Literal['None'] | Literal['NoClip']

The associated clip id or None

clip: Clip | None

The associated Clip or None

change_view_name: str

The name of the view to edit the item

media_embed_type: Literal['video', 'audio']

The type of media embed to use

media_embed_query_param: str

The query parameter to use for media embed type selection

class granicus_archiver.web.views._ItemChangeContext[source]

Bases: _ItemContext, Generic

Template context for LItemChangeView

form_data: LegistarItemFormData

The form data

clip_options: Iterable[Clip]

An iterable of possible clips to assign to the item

class granicus_archiver.web.views.LItemViewBase(request: Request)[source]

Bases: TemplatedView[ItemContext], Generic

Base class for views that display a single DetailPageResult or RGuidDetailResult instance

Parameters:

request (web.Request)

abstract async get_context_data() ItemContext[X, IdT, ItemT][source]

Get the context data for this view

Return type:

ItemContext[X, IdT, ItemT]

class granicus_archiver.web.views.LItemMixin[source]

Bases: object

Mixin for views that display a single DetailPageResult

class granicus_archiver.web.views.LItemView(request: Request)[source]

Bases: LItemMixin, LItemViewBase[_ItemContext[GUID, DetailPageResult], GUID, DetailPageResult]

View for a single DetailPageResult instance

Parameters:

request (Request)

async get_context_data() _ItemContext[GUID, DetailPageResult][source]

Get the context data for this view

Return type:

_ItemContext[GUID, DetailPageResult]

class granicus_archiver.web.views.RGItemMixin[source]

Bases: object

Mixin for views that display a single RGuidDetailResult

class granicus_archiver.web.views.RGItemView(request: Request)[source]

Bases: RGItemMixin, LItemViewBase[_ItemContext[REAL_GUID, RGuidDetailResult], REAL_GUID, RGuidDetailResult]

View for a single RGuidDetailResult instance

Parameters:

request (Request)

async get_context_data() _ItemContext[REAL_GUID, RGuidDetailResult][source]

Get the context data for this view

Return type:

_ItemContext[REAL_GUID, RGuidDetailResult]

class granicus_archiver.web.views.LItemChangeViewBase(request: Request)[source]

Bases: LItemViewBase[_ItemChangeContext, IdT, ItemT], Generic

Base class for edit views of legistar items

Parameters:

request (web.Request)

async get_context_data() _ItemChangeContext[IdT, ItemT][source]

Get the context data for this view

Return type:

_ItemChangeContext[IdT, ItemT]

class granicus_archiver.web.views.LItemChangeView(request: Request)[source]

Bases: LItemMixin, LItemChangeViewBase[GUID, DetailPageResult]

Edit view for a single DetailPageResult instance

Parameters:

request (Request)

class granicus_archiver.web.views.RGLItemChangeView(request: Request)[source]

Bases: RGItemMixin, LItemChangeViewBase[REAL_GUID, RGuidDetailResult]

Edit view for a single RGuidDetailResult instance

Parameters:

request (Request)