granicus_archiver.legistar.guid_model¶
Data model using "Real" GUID's as identifiers
This may eventually replace the granicus_archiver.legistar.model module
since its storage method is more robust.
For now however, the two exist in parallel.
- class granicus_archiver.legistar.guid_model.LegistarFile(name: KT, filename: Path, metadata: FileMeta, pdf_links_removed: bool = False)[source]¶
Bases:
LegistarFileInformation for a downloaded file within
RGuidLegistarFiles.files- property uid: LegistarFileUID¶
Unique id for the file
- class granicus_archiver.legistar.guid_model.AttachmentFile(name: KT, filename: Path, metadata: FileMeta, pdf_links_removed: bool = False)[source]¶
Bases:
AttachmentFileInformation for a downloaded attachment within
RGuidLegistarFiles.files- property uid: LegistarFileUID¶
Unique id for the file
- class granicus_archiver.legistar.guid_model.RGuidUpdateResult(changed: bool, link_keys: list[LegistarFileKey], attachment_keys: list[AttachmentName], files: dict[LegistarFileUID, LegistarFile | AttachmentFile], attributes: dict[str, Any])[source]¶
Bases:
NamedTuple- Parameters:
changed (bool)
link_keys (list[Literal['agenda', 'minutes', 'agenda_packet', 'video']])
attachment_keys (list[AttachmentName])
files (dict[LegistarFileUID, LegistarFile | AttachmentFile])
- link_keys: list[Literal['agenda', 'minutes', 'agenda_packet', 'video']]¶
Any URL attributes from
DetailPageLinksthat changed
- attachment_keys: list[AttachmentName]¶
Any keys in
DetailPageLinks.attachmentsthat changed
- files: dict[LegistarFileUID, LegistarFile | AttachmentFile]¶
Alias for field number 3
- class granicus_archiver.legistar.guid_model.RGuidLegistarFiles(base_dir: ~pathlib._local.Path, files: dict[~granicus_archiver.legistar.types.LegistarFileUID, ~granicus_archiver.legistar.guid_model.LegistarFile | ~granicus_archiver.legistar.guid_model.AttachmentFile] = <factory>)[source]¶
Bases:
SerializableCollection of files within a
RGuidDetailResult- Parameters:
base_dir (Path)
files (dict[LegistarFileUID, LegistarFile | AttachmentFile])
- base_dir: Path¶
Base directory (relative to
RGuidLegistarData.root_dir)
- files: dict[LegistarFileUID, LegistarFile | AttachmentFile]¶
Mapping of
LegistarFileorAttachmentFileobjects using theiruidas keys
- property full_base_dir: Path¶
The complete file directory (
base_dirprefixed withRGuidLegistarData.root_dir)
- get_file_path(uid: LegistarFileUID, absolute: bool) Path[source]¶
Get the filename for the given uid
- Parameters:
uid (LegistarFileUID) – A
LegistarFileUIDabsolute (bool) – If
Truethe path will be within thefull_base_dir, otherwisebase_diris used
- Return type:
Path
- add_file(uid: LegistarFileUID, meta: FileMeta, pdf_links_removed: bool) LegistarFile | AttachmentFile[source]¶
Add a file with the given uid
- Parameters:
uid (LegistarFileUID)
meta (FileMeta)
pdf_links_removed (bool)
- Return type:
- class granicus_archiver.legistar.guid_model.RGuidDetailResult(page_url: URL, feed_guid: GUID, location: str, links: DetailPageLinks, agenda_status: AgendaStatus, minutes_status: MinutesStatus, feed_item: FeedItem, last_fake_stupid_guid: GUID | None = None)[source]¶
Bases:
DetailPageResultSubclass of
model.DetailPageResultfor this module- Parameters:
page_url (URL)
feed_guid (GUID)
location (str)
links (DetailPageLinks)
agenda_status (Literal['Final', 'Final-Addendum', 'Draft', 'Not Viewable by the Public'])
minutes_status (Literal['Final', 'Final-Addendum', 'Draft', 'Not Viewable by the Public'])
feed_item (FeedItem)
last_fake_stupid_guid (GUID | None)
- files: RGuidLegistarFiles¶
Instance of
RGuidLegistarFiles
- classmethod from_html(html_str: str | bytes, feed_item: FeedItem, parent: RGuidLegistarData) Self[source]¶
Create an instance from the raw html from
page_url- Parameters:
feed_item (FeedItem)
parent (RGuidLegistarData)
- Return type:
- property guid_compare: GuidCompare¶
A helper to compare
GUID's
- get_unique_folder() Path[source]¶
Get a local path to store files for this item
The folder structure will be:
<category>/<year>/<real_guid>Where
<category>Is the
categoryof thefeed_item<year>Is the 4-digit year of the
meeting_date<real_guid>Is the
real_guid
This makes it much less complex to ensure uniqueness compared to
model.DetailPageResult.get_unique_folder(), but has a downside of being less user-friendly in a file browser (without the metadata).- Return type:
Path
- update(other: Self) RGuidUpdateResult[source]¶
Update self with changed attributes in other
- Parameters:
other (Self)
- Return type:
- class granicus_archiver.legistar.guid_model.RGuidLegistarData(root_dir: ~pathlib._local.Path, detail_results: dict[~granicus_archiver.legistar.types.REAL_GUID, ~granicus_archiver.legistar.guid_model.RGuidDetailResult] = <factory>, matched_guids: dict[~granicus_archiver.clips.model.CLIP_ID, ~granicus_archiver.legistar.types.REAL_GUID] = <factory>, items_by_clip_id: dict[~granicus_archiver.clips.model.CLIP_ID, ~granicus_archiver.legistar.guid_model.RGuidDetailResult] = <factory>, clip_id_overrides: dict[~granicus_archiver.legistar.types.REAL_GUID, ~granicus_archiver.clips.model.CLIP_ID | ~typing.Literal[_DoesNotExistEnum.DoesNotExist]] = <factory>)[source]¶
Bases:
AbstractLegistarModel[REAL_GUID,RGuidDetailResult]Container for data gathered from Legistar, using
real GUID'sas keys- Parameters:
- root_dir: Path¶
Root filesystem path for downloading assets
- detail_results: dict[REAL_GUID, RGuidDetailResult]¶
Mapping of parsed
RGuidDetailResultitems with theirfeed_guidas keys
- items_by_clip_id: dict[CLIP_ID, RGuidDetailResult]¶
Mapping of items in
detail_resultswith a validclip_id
- clip_id_overrides: dict[REAL_GUID, CLIP_ID | Literal[_DoesNotExistEnum.DoesNotExist]]¶
Mapping of items manually-linked to
Clips
- get_clip_id_for_guid(guid: REAL_GUID, use_overrides: bool = True) CLIP_ID | None | Literal[_DoesNotExistEnum.DoesNotExist][source]¶
Get the clip
idlinked to the given guid- Parameters:
use_overrides (bool) – Whether to use items in
clip_id_overrides(default isTrue)
- Return type:
Returns one of:
- create_item(html_str: str | bytes, feed_item: FeedItem, allow_update: Literal[True]) tuple[RGuidDetailResult, RGuidUpdateResult | None][source]¶
- create_item(html_str: str | bytes, feed_item: FeedItem, allow_update: Literal[False]) RGuidDetailResult
Create and add an item from html
- Parameters:
html_str – The raw html to pass to
RGuidDetailResult.from_html()feed_item – The
rss_parser.FeedItemallow_update – If an item exists and this is
True, itsupdate()method will be called. Otherwise, aKeyErrorwill be raised.
- Returns:
If allow_update is
Falsethis returnsitem (
RGuidDetailResult): The parsed item
If allow_update is
Truethis returns atupleofitem (
RGuidDetailResult): The parsed itemupdate_result: The
RGuidUpdateResultif an item was updated (orNoneif no update was performed).
- add_item(item: RGuidDetailResult) None[source]¶
Add an existing
RGuidDetailResultobject- Parameters:
item (RGuidDetailResult)
- Return type:
None
- add_detail_result(item: RGuidDetailResult) None[source]¶
Add a parsed
RGuidDetailResulttodetail_results- Parameters:
item (RGuidDetailResult)
- Return type:
None
- find_match_for_clip_id(clip_id: CLIP_ID) RGuidDetailResult | None | Literal[_DoesNotExistEnum.DoesNotExist][source]¶
Find a
RGuidDetailResultmatch for the given clip_id- Parameters:
clip_id (CLIP_ID)
- Return type:
RGuidDetailResult | None | Literal[_DoesNotExistEnum.DoesNotExist]
- is_clip_id_available(clip_id: CLIP_ID) bool[source]¶
Check whether the given clip id is linked to an item (returns
Trueif there is no link)
- is_guid_matched(guid: REAL_GUID) bool[source]¶
Check whether the item matching guid has a
Clipassociated with it
- add_guid_match(clip_id: CLIP_ID, guid: REAL_GUID) None[source]¶
Add a
Clip.id -> FeedItemmatch tomatched_guidsThis may seem redunant considering the
find_match_for_clip_id()method, but is intended for adding matches for items without avideourl to parse.
- add_clip_match_override(real_guid: REAL_GUID, clip_id: CLIP_ID | None | Literal[_DoesNotExistEnum.DoesNotExist]) None[source]¶
Add a manual override for the given real_guid
- Parameters:
- Return type:
None
- iter_guid_matches() Iterator[tuple[CLIP_ID, RGuidDetailResult]][source]¶
Iterate over items added by the
add_guid_match(),add_guid_match()andadd_clip_match_override()methodsResults are tuples of
CLIP_IDandRGuidDetailResult- Return type:
- get_folder_for_item(item: REAL_GUID | RGuidDetailResult) Path[source]¶
Get a local path to store files for a
RGuidDetailResultThis is the result of
RGuidLegistarFiles.full_base_dirfromRGuidDetailResult.files- Parameters:
item (REAL_GUID | RGuidDetailResult)
- Return type:
Path