SYMBOL INDEX (2299 symbols across 384 files) FILE: bin/icons_transform.py function create_maskable_icon (line 31) | def create_maskable_icon(input_path): function inkscape (line 47) | def inkscape(input_path, export_path, width, height): function transform_icon (line 61) | def transform_icon(name, size): function picopt (line 100) | def picopt(): function main (line 106) | def main(): FILE: bin/manage.py function main (line 8) | def main(): FILE: bin/roman.py function build_ignore_spec (line 46) | def build_ignore_spec(ignore_path: Path | None) -> PathSpec: function read_first_two_lines (line 56) | def read_first_two_lines(path: Path) -> tuple[str, str]: function is_shell_script (line 70) | def is_shell_script(line1: str) -> bool: function has_description_comment (line 75) | def has_description_comment(line2: str) -> bool: function iter_files (line 80) | def iter_files(path_strs: Sequence[str], spec: PathSpec) -> Generator[Pa... function build_parser (line 120) | def build_parser() -> ArgumentParser: function _parse_ignore_file (line 145) | def _parse_ignore_file(args: Namespace) -> PathSpec: function main (line 160) | def main() -> None: FILE: cfg/eslint.config.base.js constant FLAT_ALL (line 28) | const FLAT_ALL = "flat/all"; constant FLAT_RECOMMENDED (line 29) | const FLAT_RECOMMENDED = "flat/recommended"; constant CONFIGS (line 31) | const CONFIGS = { FILE: ci/cleanup-repo.py function login (line 18) | def login(username, password): function fetch_all_tags (line 37) | def fetch_all_tags(namespace, repo, token): function delete_tag (line 52) | def delete_tag(namespace, repo, tag, token, retries=3, delay=2): function read_password (line 68) | def read_password(args): function get_args (line 79) | def get_args(): function _init (line 115) | def _init(): function _get_tags_to_delete (line 126) | def _get_tags_to_delete(args, token): function main (line 154) | def main(): FILE: codex/applications/lifespan.py class LifespanApplication (line 13) | class LifespanApplication: method __init__ (line 18) | def __init__(self, broadcast_queue) -> None: method _event (line 25) | async def _event(self, event, send) -> None: method _startup (line 38) | async def _startup(self) -> None: method _shutdown (line 45) | async def _shutdown(self) -> None: method __call__ (line 53) | async def __call__(self, scope, receive, send) -> None: FILE: codex/authentication.py class BearerTokenAuthentication (line 7) | class BearerTokenAuthentication(TokenAuthentication): class HttpRemoteUserMiddleware (line 13) | class HttpRemoteUserMiddleware(RemoteUserMiddleware): FILE: codex/choices/admin.py class AdminFlagChoices (line 8) | class AdminFlagChoices(TextChoices): FILE: codex/choices/choices_to_json.py function _to_vuetify_choices (line 44) | def _to_vuetify_choices(defaults, key: str, obj_map) -> list: function _json_key (line 59) | def _json_key(key: str): function _make_json_serializable (line 64) | def _make_json_serializable(data, *, jsonize_keys: bool = True) -> list ... function _to_vuetify_dict (line 78) | def _to_vuetify_dict(fn: str, data) -> dict: function _dump (line 91) | def _dump( function _make_websocket_messages (line 106) | def _make_websocket_messages() -> MappingProxyType: function main (line 112) | def main() -> None: FILE: codex/choices/notifications.py class Notifications (line 6) | class Notifications(Enum): FILE: codex/choices/search.py function gen_multipart_field_aliases (line 32) | def gen_multipart_field_aliases(field) -> frozenset: function _get_fieldmap_values (line 51) | def _get_fieldmap_values(*args) -> tuple: function create_search_field_map (line 125) | def create_search_field_map() -> dict: FILE: codex/librarian/bookmark/bookmarkd.py class BookmarkKey (line 24) | class BookmarkKey: method __hash__ (line 32) | def __hash__(self) -> int: method __eq__ (line 40) | def __eq__(self, other) -> bool: class BookmarkThread (line 45) | class BookmarkThread( method __init__ (line 55) | def __init__(self, *args, **kwargs) -> None: method _process_task_immediately (line 61) | def _process_task_immediately(self, task) -> None: method aggregate_items (line 78) | def aggregate_items(self, item) -> None: method send_all_items (line 96) | def send_all_items(self) -> None: FILE: codex/librarian/bookmark/latest_version.py class CodexLatestVersionUpdater (line 21) | class CodexLatestVersionUpdater(WorkerStatusBase): method _fetch_latest_version (line 25) | def _fetch_latest_version(): method update_latest_version (line 32) | def update_latest_version(self, *, force: bool, update: bool = False) ... FILE: codex/librarian/bookmark/tasks.py class BookmarkTask (line 10) | class BookmarkTask(LibrarianTask): class BookmarkUpdateTask (line 15) | class BookmarkUpdateTask(BookmarkTask): class UserActiveTask (line 24) | class UserActiveTask(BookmarkTask): class ClearLibrarianStatusTask (line 30) | class ClearLibrarianStatusTask(BookmarkTask): class CodexLatestVersionTask (line 35) | class CodexLatestVersionTask(BookmarkTask): FILE: codex/librarian/bookmark/update.py class BookmarkUpdateMixin (line 21) | class BookmarkUpdateMixin(GroupACLMixin): method _get_existing_bookmarks_for_update (line 27) | def _get_existing_bookmarks_for_update( method _prepare_bookmark_updates (line 45) | def _prepare_bookmark_updates(cls, existing_bookmarks, updates) -> list: method _update_bookmarks_validate_page (line 57) | def _update_bookmarks_validate_page(bm, updates) -> None: method _notify_library_changed (line 70) | def _notify_library_changed(uid) -> None: method _update_bookmarks (line 77) | def _update_bookmarks(cls, auth_filter, comic_pks, updates) -> int: method _get_comics_without_bookmarks (line 95) | def _get_comics_without_bookmarks(cls, auth_filter, comic_pks): method _prepare_bookmark_creates (line 104) | def _prepare_bookmark_creates( method _create_bookmarks (line 115) | def _create_bookmarks(cls, auth_filter, comic_pks, updates) -> int: method update_bookmarks (line 139) | def update_bookmarks(cls, auth_filter, comic_pks, updates) -> int: FILE: codex/librarian/bookmark/user_active.py class UserActiveMixin (line 12) | class UserActiveMixin: method init_user_active (line 18) | def init_user_active(self) -> None: method update_user_active (line 22) | def update_user_active(self, pk: int, log) -> None: FILE: codex/librarian/covers/coverd.py class CoverThread (line 15) | class CoverThread(CoverPurgeThread): method process_item (line 19) | def process_item(self, item) -> None: FILE: codex/librarian/covers/create.py class CoverCreateThread (line 27) | class CoverCreateThread(QueuedThread, CoverPathMixin, ABC): method _create_cover_thumbnail (line 31) | def _create_cover_thumbnail(cls, cover_image_data) -> BytesIO: method _get_comic_cover_image (line 46) | def _get_comic_cover_image(cls, comic_path, log): method _get_custom_cover_image (line 60) | def _get_custom_cover_image(cls, cover_path): method create_cover_from_path (line 66) | def create_cover_from_path( method save_cover_to_cache (line 95) | def save_cover_to_cache(self, cover_path_str: str, data) -> None: method _bulk_create_comic_cover (line 106) | def _bulk_create_comic_cover( method _bulk_create_comic_covers (line 127) | def _bulk_create_comic_covers(self, pks, *, custom: bool) -> int: method create_all_covers (line 149) | def create_all_covers(self) -> None: FILE: codex/librarian/covers/path.py class CoverPathMixin (line 8) | class CoverPathMixin: method _hex_path (line 18) | def _hex_path(cls, pk: int) -> Path: method get_cover_path (line 28) | def get_cover_path(cls, pk: int, *, custom: bool): method get_cover_paths (line 35) | def get_cover_paths(cls, pks, *, custom: bool) -> set: FILE: codex/librarian/covers/purge.py class CoverPurgeThread (line 14) | class CoverPurgeThread(CoverCreateThread, ABC): method _cleanup_cover_dirs (line 20) | def _cleanup_cover_dirs(cls, path, cover_root) -> None: method purge_cover_paths (line 30) | def purge_cover_paths(self, cover_paths, cover_root) -> int: method purge_comic_covers (line 51) | def purge_comic_covers(self, pks: frozenset[int], *, custom: bool) -> ... method purge_all_comic_covers (line 57) | def purge_all_comic_covers(self, librarian_queue) -> None: method _cleanup_orphan_covers (line 74) | def _cleanup_orphan_covers(self, cover_class, cover_root: Path, name: ... method cleanup_orphan_covers (line 95) | def cleanup_orphan_covers(self) -> None: FILE: codex/librarian/covers/status.py class CoversStatus (line 8) | class CoversStatus(Status, ABC): class CreateCoversStatus (line 14) | class CreateCoversStatus(CoversStatus): class RemoveCoversStatus (line 21) | class RemoveCoversStatus(CoversStatus): class FindOrphanCoversStatus (line 29) | class FindOrphanCoversStatus(CoversStatus): FILE: codex/librarian/covers/tasks.py class CoverTask (line 9) | class CoverTask(LibrarianTask): class CoverRemoveAllTask (line 14) | class CoverRemoveAllTask(CoverTask): class CoverRemoveOrphansTask (line 19) | class CoverRemoveOrphansTask(CoverTask): class CoverRemoveTask (line 24) | class CoverRemoveTask(CoverTask): class CoverSaveToCache (line 32) | class CoverSaveToCache(CoverTask): class CoverCreateAllTask (line 40) | class CoverCreateAllTask(CoverTask): FILE: codex/librarian/cron/crond.py class CronThread (line 24) | class CronThread(NamedThread): method __init__ (line 27) | def __init__(self, *args, **kwargs) -> None: method _create_task_times (line 34) | def _create_task_times(self) -> None: method _get_timeout (line 42) | def _get_timeout(self) -> int: method _run_expired_jobs (line 53) | def _run_expired_jobs(self) -> None: method run (line 63) | def run(self) -> None: method end_timeout (line 81) | def end_timeout(self) -> None: method stop (line 87) | def stop(self) -> None: FILE: codex/librarian/fs/event_batcherd.py class FSEventBatcherThread (line 45) | class FSEventBatcherThread(AggregateMessageQueuedThread): method create_import_task_args (line 52) | def create_import_task_args(library_id: int) -> dict: method _remove_paths (line 59) | def _remove_paths(args, deleted_key: str, moved_key: str) -> None: method deduplicate_events (line 65) | def deduplicate_events(cls, args: dict) -> None: method __init__ (line 87) | def __init__(self, *args, **kwargs) -> None: method _args_field_by_event (line 94) | def _args_field_by_event(self, library_id: int, event: FSEvent): method aggregate_items (line 106) | def aggregate_items(self, item) -> None: method _set_check_metadata_mtime (line 126) | def _set_check_metadata_mtime(self, item) -> None: method _start_poll (line 133) | def _start_poll(self, item) -> None: method _finish_poll (line 137) | def _finish_poll(self, item) -> None: method process_item (line 142) | def process_item(self, item) -> None: method _subtract_args_items (line 152) | def _subtract_args_items(self, args) -> None: method _create_task (line 159) | def _create_task(self, library_id) -> ImportTask: method _send_import_task (line 168) | def _send_import_task(self, library_id: int) -> None: method send_all_items (line 176) | def send_all_items(self) -> None: FILE: codex/librarian/fs/events.py class FSChange (line 9) | class FSChange(IntEnum): class FSEvent (line 19) | class FSEvent: method diff_key (line 29) | def diff_key(self) -> str: FILE: codex/librarian/fs/filters.py function _build_comic_matcher (line 16) | def _build_comic_matcher() -> re.Pattern: function _match_suffix (line 39) | def _match_suffix(pattern: re.Pattern, path: Path) -> bool: function match_comic (line 44) | def match_comic(path: Path) -> bool: function match_image (line 49) | def match_image(path: Path) -> bool: function match_folder_cover (line 54) | def match_folder_cover(path: Path) -> bool: function match_group_cover_image (line 59) | def match_group_cover_image(path: Path) -> bool: FILE: codex/librarian/fs/poller/events.py class PollEventType (line 7) | class PollEventType(IntEnum): class PollEvent (line 15) | class PollEvent: FILE: codex/librarian/fs/poller/poller.py class LibraryPollerThread (line 34) | class LibraryPollerThread(NamedThread, WorkerStatusMixin): method __init__ (line 37) | def __init__(self, *args, **kwargs) -> None: method wake (line 50) | def wake(self) -> None: method poll (line 55) | def poll(self, task: FSPollLibrariesTask) -> None: method stop (line 65) | def stop(self) -> None: method _get_poll_timeout (line 76) | def _get_poll_timeout(self, library: Library) -> float | None: # noqa... method _seconds_until_poll (line 115) | def _seconds_until_poll(library: Library) -> float: method _get_diff (line 125) | def _get_diff(self, library: Library, *, force: bool) -> SnapshotDiff ... method _queue_poll_events (line 146) | def _queue_poll_events(self, library: Library, *, force: bool) -> None: method _poll_library (line 178) | def _poll_library(self, library: Library, *, force: bool) -> None: method _get_min_timeout (line 199) | def _get_min_timeout(self) -> float | None: method _poll_due_libraries (line 223) | def _poll_due_libraries(self, *, force: bool = False) -> None: method _handle_pending_polls (line 237) | def _handle_pending_polls(self) -> None: method run (line 255) | def run(self) -> None: FILE: codex/librarian/fs/poller/snapshot.py class Snapshot (line 19) | class Snapshot: method __init__ (line 22) | def __init__( method _inode (line 33) | def _inode(self, st: os.stat_result) -> tuple[int, int]: method _set_lookups (line 38) | def _set_lookups(self, path: str, st: os.stat_result) -> None: method paths (line 45) | def paths(self) -> frozenset[str]: method inode (line 49) | def inode(self, path: str) -> tuple[int, int]: method path (line 54) | def path(self, st_lookup: tuple[int, int]) -> str | None: method mtime (line 58) | def mtime(self, path: str) -> float: method size (line 62) | def size(self, path: str) -> int: method is_dir (line 66) | def is_dir(self, path: str) -> bool: method is_cover (line 70) | def is_cover(self, path: str) -> bool: class DiskSnapshot (line 75) | class DiskSnapshot(Snapshot): method __init__ (line 78) | def __init__( method _init_walk (line 96) | def _init_walk(self): method _walk (line 102) | def _walk(self, root: str) -> None: class DatabaseSnapshot (line 124) | class DatabaseSnapshot(Snapshot): method __init__ (line 131) | def __init__( method _init_walk (line 147) | def _init_walk(self): method _walk (line 164) | def _walk(root: str, models: tuple) -> Iterator: method _create_stat (line 173) | def _create_stat(self, wp: dict, *, force: bool) -> os.stat_result: FILE: codex/librarian/fs/poller/snapshot_diff.py class _DiffData (line 37) | class _DiffData: class SnapshotDiff (line 49) | class SnapshotDiff: method _init_added (line 52) | def _init_added(self, data: _DiffData, snapshot: Snapshot): method _init_deleted (line 61) | def _init_deleted(self, data: _DiffData, ref: Snapshot): method _init_modified (line 70) | def _init_modified(self, data: _DiffData, snapshot: Snapshot): method _init_moved (line 79) | def _init_moved(self, data: _DiffData, ref: Snapshot): method __init__ (line 88) | def __init__( method _is_inode_equal (line 128) | def _is_inode_equal(self, data: _DiffData, path: str) -> bool: method _is_stats_equal (line 132) | def _is_stats_equal(self, data: _DiffData, old_path: str, new_path: st... method _check_unchanged_for_inode_changes (line 138) | def _check_unchanged_for_inode_changes(self, data: _DiffData) -> None: method _find_moved_paths (line 144) | def _find_moved_paths(self, data: _DiffData) -> None: method _find_modified_paths (line 158) | def _find_modified_paths(self, data: _DiffData) -> None: method is_empty (line 170) | def is_empty(self) -> bool: method to_events (line 189) | def to_events(self) -> tuple[FSEvent, ...]: FILE: codex/librarian/fs/poller/status.py class FSPollStatus (line 6) | class FSPollStatus(FSStatus): FILE: codex/librarian/fs/poller/tasks.py class FSPollLibrariesTask (line 9) | class FSPollLibrariesTask(FSTask): FILE: codex/librarian/fs/status.py class FSStatus (line 8) | class FSStatus(Status, ABC): FILE: codex/librarian/fs/tasks.py class FSTask (line 11) | class FSTask(LibrarianTask): class FSEventTask (line 16) | class FSEventTask(FSTask): FILE: codex/librarian/fs/watcher/data.py class ChangeBatch (line 9) | class ChangeBatch: FILE: codex/librarian/fs/watcher/dirs.py function _classify_added_file (line 20) | def _classify_added_file(path: Path, *, covers_only: bool) -> FSEvent | ... function expand_dir_added (line 33) | def expand_dir_added( function expand_dir_deleted (line 55) | def expand_dir_deleted(dir_path: str, library_pk: int, batch: ChangeBatc... FILE: codex/librarian/fs/watcher/events.py function _process_change (line 22) | def _process_change( function _find_library (line 73) | def _find_library( function process_changes (line 83) | def process_changes( FILE: codex/librarian/fs/watcher/move.py function _model_for_event (line 17) | def _model_for_event(event: FSEvent): function _get_db_inode (line 26) | def _get_db_inode(event: FSEvent, library_pk: int) -> int | None: function _get_disk_inode (line 39) | def _get_disk_inode(path: str) -> int | None: function _detect_one_move (line 48) | def _detect_one_move( function detect_moves (line 90) | def detect_moves(batch: ChangeBatch) -> list[tuple[int, FSEvent]]: FILE: codex/librarian/fs/watcher/status.py class FSWatcherRestartStatus (line 6) | class FSWatcherRestartStatus(FSStatus): FILE: codex/librarian/fs/watcher/tasks.py class FSWatcherRestartTask (line 9) | class FSWatcherRestartTask(FSTask): FILE: codex/librarian/fs/watcher/watcher.py class CodexWatchFilter (line 24) | class CodexWatchFilter: method __init__ (line 27) | def __init__(self, covers_only_paths: set[str]): method __call__ (line 31) | def __call__(self, change: Change, path: str) -> bool: class LibraryWatcherThread (line 53) | class LibraryWatcherThread(NamedThread): method __init__ (line 56) | def __init__(self, *args, **kwargs) -> None: method _log_update_paths_from_db (line 65) | def _log_update_paths_from_db(self, new_paths_dict: dict[str, int]): method _update_paths_from_db (line 78) | def _update_paths_from_db(self) -> None: method restart (line 108) | def restart(self) -> None: method _process_changes (line 122) | def _process_changes(self, changes: set[tuple[Change, str]]) -> None: method _get_extant_paths (line 132) | def _get_extant_paths(self, paths: list[str]) -> list[str]: method _watch_loop (line 152) | def _watch_loop(self) -> None: method run (line 179) | def run(self) -> None: method stop (line 187) | def stop(self) -> None: FILE: codex/librarian/librariand.py class LibrarianDaemon (line 59) | class LibrarianDaemon(Process): method __init__ (line 62) | def __init__(self, logger_, queue: Queue, broadcast_queue: Queue) -> N... method _restart_fs_watcher (line 80) | def _restart_fs_watcher(self) -> None: method _restart_codex (line 83) | def _restart_codex(self, task: LibrarianTask) -> None: method _process_task (line 87) | def _process_task(self, task) -> None: method _create_threads (line 112) | def _create_threads(self) -> None: method _start_threads (line 131) | def _start_threads(self) -> None: method _startup (line 138) | def _startup(self) -> None: method _stop_threads (line 146) | def _stop_threads(self) -> None: method _join_threads (line 153) | def _join_threads(self) -> None: method _shutdown (line 160) | def _shutdown(self) -> None: method run (line 172) | def run(self) -> None: method stop (line 195) | def stop(self) -> None: FILE: codex/librarian/memory.py function _get_cgroups2_mem_limit (line 18) | def _get_cgroups2_mem_limit() -> int: function _get_cgroups1_mem_limit (line 24) | def _get_cgroups1_mem_limit() -> int | None: function get_mem_limit (line 36) | def get_mem_limit(divisor="b"): FILE: codex/librarian/notifier/notifierd.py class NotifierThread (line 8) | class NotifierThread(AggregateMessageQueuedThread): method __init__ (line 11) | def __init__(self, *args, broadcast_queue, **kwargs) -> None: method aggregate_items (line 17) | def aggregate_items(self, item) -> None: method _send_task (line 21) | def _send_task(self, task) -> None: method send_all_items (line 38) | def send_all_items(self) -> None: method stop (line 53) | def stop(self) -> None: FILE: codex/librarian/notifier/tasks.py class NotifierTask (line 11) | class NotifierTask(LibrarianTask): FILE: codex/librarian/restarter/restarter.py class CodexRestarter (line 19) | class CodexRestarter(WorkerStatusBase): method _shutdown_codex (line 22) | def _shutdown_codex( method shutdown_codex (line 36) | def shutdown_codex(self) -> None: method restart_codex (line 40) | def restart_codex(self) -> None: method handle_task (line 44) | def handle_task(self, task) -> None: FILE: codex/librarian/restarter/status.py class CodexRestarterStatus (line 8) | class CodexRestarterStatus(Status, ABC): class CodexRestarterRestartStatus (line 12) | class CodexRestarterRestartStatus(CodexRestarterStatus): class CodexRestarterStopStatus (line 22) | class CodexRestarterStopStatus(CodexRestarterStatus): FILE: codex/librarian/restarter/tasks.py class CodexRestarterTask (line 6) | class CodexRestarterTask(LibrarianTask): class CodexRestartTask (line 10) | class CodexRestartTask(CodexRestarterTask): class CodexShutdownTask (line 14) | class CodexShutdownTask(CodexRestarterTask): FILE: codex/librarian/scribe/importer/const.py function get_key_index (line 306) | def get_key_index(model: type[BaseModel]) -> int: FILE: codex/librarian/scribe/importer/create/__init__.py class CreateForeignKeysImporter (line 12) | class CreateForeignKeysImporter(CreateForeignKeysCreateUpdateImporter): method create_and_update (line 15) | def create_and_update(self) -> None: FILE: codex/librarian/scribe/importer/create/comics.py class CreateComicsImporter (line 28) | class CreateComicsImporter(CreateForeignKeyLinksImporter): method _populate_fts_attribute_values (line 31) | def _populate_fts_attribute_values(self, key: str, sub_key: str | int,... method _update_comic_values (line 38) | def _update_comic_values( method update_comics (line 59) | def update_comics(self) -> int: method _bulk_create_comic (line 112) | def _bulk_create_comic(self, path: str, create_comics: list[Comic]) ->... method create_comics (line 123) | def create_comics(self) -> int: FILE: codex/librarian/scribe/importer/create/covers.py class CreateCoversImporter (line 22) | class CreateCoversImporter(CreateComicsImporter): method add_custom_cover_to_group (line 26) | def add_custom_cover_to_group(group_class, obj) -> None: method update_custom_covers (line 38) | def update_custom_covers(self) -> int: method create_custom_covers (line 82) | def create_custom_covers(self) -> int: FILE: codex/librarian/scribe/importer/create/folders.py class CreateForeignKeysFolderImporter (line 11) | class CreateForeignKeysFolderImporter(CreateCoversImporter): method _get_parent_folder (line 14) | def _get_parent_folder(self, path: Path): method _bulk_folders_create_add_folder (line 30) | def _bulk_folders_create_add_folder(self, path: Path, create_folders) ... method _bulk_folders_create_depth_level (line 43) | def _bulk_folders_create_depth_level(self, paths, status: Status) -> int: method bulk_folders_create (line 59) | def bulk_folders_create(self, folder_paths: frozenset, status) -> int: method bulk_folders_update (line 86) | def bulk_folders_update(self, folder_paths: frozenset, status) -> int: FILE: codex/librarian/scribe/importer/create/foreign_keys.py class CreateForeignKeysCreateUpdateImporter (line 42) | class CreateForeignKeysCreateUpdateImporter(CreateForeignKeysFolderImpor... method _get_create_update_args (line 46) | def _get_create_update_args( method _add_custom_cover (line 77) | def _add_custom_cover(self, model, obj) -> None: method _finish_create_update (line 80) | def _finish_create_update(self, model, objs, status: Status) -> None: method _bulk_create_models (line 89) | def _bulk_create_models( method bulk_create_all_models (line 141) | def bulk_create_all_models(self, status) -> int: method _bulk_update_models (line 171) | def _bulk_update_models(self, model: type[BaseModel], status) -> int: method bulk_update_all_models (line 216) | def bulk_update_all_models(self, status) -> int: method create_all_fks (line 223) | def create_all_fks(self) -> int: method update_all_fks (line 242) | def update_all_fks(self) -> int: FILE: codex/librarian/scribe/importer/create/link_fks.py class CreateForeignKeyLinksImporter (line 27) | class CreateForeignKeyLinksImporter(LinkComicsImporter): method _get_comic_folder_fk_link (line 30) | def _get_comic_folder_fk_link(self, md, subkey: int | str, path: str) ... method _get_comic_protagonist_fk_link (line 39) | def _get_comic_protagonist_fk_link(self, md, link_fks: dict[str, tuple... method _get_comic_simple_fk_links (line 50) | def _get_comic_simple_fk_links( method get_comic_fk_links (line 66) | def get_comic_fk_links(self, subkey: str | int, path: str) -> dict: FILE: codex/librarian/scribe/importer/delete/__init__.py class DeletedImporter (line 7) | class DeletedImporter(DeletedFoldersImporter): method delete (line 10) | def delete(self) -> None: FILE: codex/librarian/scribe/importer/delete/comics.py class DeletedComicsImporter (line 13) | class DeletedComicsImporter(DeletedCoversImporter): method _init_deleted_comic_groups (line 17) | def _init_deleted_comic_groups() -> dict: method _populate_deleted_comic_group (line 29) | def _populate_deleted_comic_group(deleted_comic_groups, comic) -> None: method _populate_deleted_comic_groups (line 45) | def _populate_deleted_comic_groups(cls, delete_qs, deleted_comic_group... method bulk_comics_deleted (line 55) | def bulk_comics_deleted(self, **kwargs) -> tuple[int, dict]: FILE: codex/librarian/scribe/importer/delete/covers.py class DeletedCoversImporter (line 9) | class DeletedCoversImporter(SearchIndexImporter): method remove_covers (line 12) | def remove_covers(self, delete_pks, *, custom: bool) -> None: method bulk_covers_deleted (line 17) | def bulk_covers_deleted(self, **kwargs) -> int: FILE: codex/librarian/scribe/importer/delete/folders.py class DeletedFoldersImporter (line 9) | class DeletedFoldersImporter(DeletedComicsImporter): method bulk_folders_deleted (line 12) | def bulk_folders_deleted(self, **kwargs) -> int: FILE: codex/librarian/scribe/importer/failed/create.py class FailedImportsCreateUpdateImporter (line 18) | class FailedImportsCreateUpdateImporter(FailedImportsQueryImporter): method _bulk_update_failed_imports (line 21) | def _bulk_update_failed_imports( method _bulk_create_failed_imports (line 58) | def _bulk_create_failed_imports( FILE: codex/librarian/scribe/importer/failed/failed.py class FailedImportsImporter (line 13) | class FailedImportsImporter(FailedImportsCreateUpdateImporter): method _bulk_cleanup_failed_imports (line 16) | def _bulk_cleanup_failed_imports( method fail_imports (line 39) | def fail_imports(self) -> None: FILE: codex/librarian/scribe/importer/failed/query.py class FailedImportsQueryImporter (line 21) | class FailedImportsQueryImporter(DeletedImporter): method _query_failed_import_deletes (line 24) | def _query_failed_import_deletes(self, existing_failed_import_paths, n... method _query_failed_imports (line 55) | def _query_failed_imports( FILE: codex/librarian/scribe/importer/finish.py class FinishImporter (line 37) | class FinishImporter(InitImporter): method _get_log_finish_changed_text (line 40) | def _get_log_finish_changed_text(self, elapsed, elapsed_time) -> str: method _log_finish (line 59) | def _log_finish(self) -> None: method finish (line 69) | def finish(self) -> None: FILE: codex/librarian/scribe/importer/importer.py class ComicImporter (line 18) | class ComicImporter(MovedImporter): method apply (line 21) | def apply(self) -> None: FILE: codex/librarian/scribe/importer/init.py class Counts (line 58) | class Counts: method _any (line 76) | def _any(self, exclude_prefixes: tuple[str, ...]) -> bool: method changed (line 83) | def changed(self): method search_changed (line 87) | def search_changed(self): class InitImporter (line 97) | class InitImporter(WorkerStatusBase): method __init__ (line 100) | def __init__( method _wait_for_filesystem_ops_to_finish (line 115) | def _wait_for_filesystem_ops_to_finish(self) -> bool: method _log_task_construct_dirs_log (line 156) | def _log_task_construct_dirs_log(self) -> list: method _log_task_construct_comics_log (line 167) | def _log_task_construct_comics_log(self) -> list: method _log_task (line 180) | def _log_task(self) -> None: method _init_librarian_status_moved (line 201) | def _init_librarian_status_moved(self, status_list) -> int: method _init_if_modified_or_created (line 213) | def _init_if_modified_or_created(self, path, status_list) -> tuple: method _init_librarian_status_deleted (line 280) | def _init_librarian_status_deleted(self, status_list) -> int: method _init_librarian_status_search_index (line 299) | def _init_librarian_status_search_index( method _init_librarian_status (line 309) | def _init_librarian_status(self, path) -> None: method init_apply (line 324) | def init_apply(self) -> None: FILE: codex/librarian/scribe/importer/link/__init__.py class LinkComicsImporter (line 6) | class LinkComicsImporter(LinkManyToManyImporter): method link (line 9) | def link(self) -> None: FILE: codex/librarian/scribe/importer/link/covers.py class LinkCoversImporter (line 14) | class LinkCoversImporter(FailedImportsImporter): method _link_custom_cover_prepare (line 17) | def _link_custom_cover_prepare(self, cover, model_map) -> None: method _link_custom_cover_group (line 40) | def _link_custom_cover_group(self, model, objs, status) -> None: method link_custom_covers (line 48) | def link_custom_covers(self) -> int | None: FILE: codex/librarian/scribe/importer/link/delete.py class LinkImporterDelete (line 21) | class LinkImporterDelete(LinkComicsImporterPrepare): method get_through_model (line 25) | def get_through_model(field: ManyToManyField) -> type[BaseModel]: method _delete_m2m_field_batch (line 30) | def _delete_m2m_field_batch( method _delete_m2m_fts_entries (line 48) | def _delete_m2m_fts_entries(self, field_name: str, comic_ids: set[int]... method delete_m2m_field (line 60) | def delete_m2m_field(self, field_name: str, delete_m2ms: dict, status)... method delete_m2ms (line 97) | def delete_m2ms(self, status) -> int: FILE: codex/librarian/scribe/importer/link/many_to_many.py class LinkManyToManyImporter (line 18) | class LinkManyToManyImporter(LinkSumImporter): method link_comic_m2m_field (line 21) | def link_comic_m2m_field(self, field_name, m2m_links, status: Status) ... method link_comic_m2m_fields (line 56) | def link_comic_m2m_fields(self) -> int: FILE: codex/librarian/scribe/importer/link/prepare.py class LinkComicsImporterPrepare (line 26) | class LinkComicsImporterPrepare(LinkCoversImporter): method _get_link_folders_filter (line 30) | def _get_link_folders_filter(_field_name, values_set) -> Q: method _get_link_complex_model_filter (line 36) | def _get_link_complex_model_filter(field_name, values_set) -> Q: method _add_complex_link_to_fts (line 45) | def _add_complex_link_to_fts( method _link_prepare_complex_m2ms (line 62) | def _link_prepare_complex_m2ms( method _link_prepare_named_m2ms (line 83) | def _link_prepare_named_m2ms( method link_prepare_m2m_links (line 105) | def link_prepare_m2m_links(self, status) -> Mapping: FILE: codex/librarian/scribe/importer/link/sum.py class LinkSumImporter (line 6) | class LinkSumImporter(LinkImporterDelete): method sum_path_ops (line 9) | def sum_path_ops(self, key) -> int: method sum_ops (line 17) | def sum_ops(self, key): FILE: codex/librarian/scribe/importer/moved/__init__.py class MovedImporter (line 13) | class MovedImporter(MovedFoldersImporter): method _bulk_folders_modified (line 16) | def _bulk_folders_modified(self) -> int: method move_and_modify_dirs (line 45) | def move_and_modify_dirs(self) -> None: FILE: codex/librarian/scribe/importer/moved/comics.py class MovedComicsImporter (line 21) | class MovedComicsImporter(ReadMetadataImporter): method _bulk_comics_moved_ensure_folders (line 24) | def _bulk_comics_moved_ensure_folders(self) -> None: method _prepare_moved_comic (line 52) | def _prepare_moved_comic( method _bulk_comics_move_prepare (line 77) | def _bulk_comics_move_prepare(self) -> tuple[list, dict, dict]: method bulk_comics_moved (line 99) | def bulk_comics_moved(self) -> int: FILE: codex/librarian/scribe/importer/moved/covers.py class MovedCoversImporter (line 17) | class MovedCoversImporter(MovedComicsImporter): method _bulk_covers_moved_prepare (line 20) | def _bulk_covers_moved_prepare(self, status) -> tuple[list, set]: method _bulk_covers_moved_unlink (line 44) | def _bulk_covers_moved_unlink(self, unlink_pks) -> None: method bulk_covers_moved (line 63) | def bulk_covers_moved(self, status=None) -> int: FILE: codex/librarian/scribe/importer/moved/folders.py class MovedFoldersImporter (line 18) | class MovedFoldersImporter(MovedCoversImporter): method _folder_sort_key (line 22) | def _folder_sort_key(element: Folder) -> int: method _bulk_move_folders (line 25) | def _bulk_move_folders( method _bulk_move_folders_under_existing_parents (line 66) | def _bulk_move_folders_under_existing_parents( method _get_move_create_folders_one_layer (line 108) | def _get_move_create_folders_one_layer( method _remove_move_collisions (line 135) | def _remove_move_collisions(self, dirs_moved: bidict[str, str]) -> None: method _bulk_move_folders_and_create_parents (line 150) | def _bulk_move_folders_and_create_parents(self, status) -> int: method bulk_folders_moved (line 189) | def bulk_folders_moved(self, *, mark_in_progress=False) -> int: FILE: codex/librarian/scribe/importer/query/__init__.py class QueryForeignKeysImporter (line 15) | class QueryForeignKeysImporter(QueryPruneLinks): method query (line 18) | def query(self) -> None: FILE: codex/librarian/scribe/importer/query/covers.py class QueryCustomCoversImporter (line 18) | class QueryCustomCoversImporter(CreateForeignKeysImporter): method query_missing_custom_covers (line 21) | def query_missing_custom_covers(self) -> None: FILE: codex/librarian/scribe/importer/query/filters.py class QueryForeignKeysFilterImporter (line 11) | class QueryForeignKeysFilterImporter(QueryCustomCoversImporter): method _get_query_missing_simple_filter (line 15) | def _get_query_missing_simple_filter( method _query_missing_complex_model_filter (line 26) | def _query_missing_complex_model_filter( method query_missing_model_filter (line 46) | def query_missing_model_filter( FILE: codex/librarian/scribe/importer/query/foreign_keys.py class QueryForeignKeysQueryImporter (line 26) | class QueryForeignKeysQueryImporter(QueryIsUpdateImporter): method query_existing_mds (line 29) | def query_existing_mds( method _query_missing_models_batch (line 57) | def _query_missing_models_batch( method _finish_query_missing (line 95) | def _finish_query_missing( method query_missing_models (line 126) | def query_missing_models( method _query_missing_model (line 165) | def _query_missing_model(self, model: type[BaseModel], status: Status)... method _set_fk_totals (line 179) | def _set_fk_totals(self, fk_key: str, status_class) -> None: method query_all_missing_models (line 188) | def query_all_missing_models(self): FILE: codex/librarian/scribe/importer/query/links.py class QueryPruneLinks (line 11) | class QueryPruneLinks(QueryPruneLinksM2M): method query_prune_comic_links (line 14) | def query_prune_comic_links(self) -> None: FILE: codex/librarian/scribe/importer/query/links_fk.py class QueryPruneLinksFKs (line 19) | class QueryPruneLinksFKs(QueryUpdateComics): method pop_links_to_fts (line 22) | def pop_links_to_fts(self, path, field_name) -> None: method _query_prune_comic_fk_links_protagonist (line 27) | def _query_prune_comic_fk_links_protagonist( method _query_prune_comic_fk_links_key_equal (line 37) | def _query_prune_comic_fk_links_key_equal(field_obj, key_rel, key_valu... method _query_prune_comic_fk_links_field (line 46) | def _query_prune_comic_fk_links_field(self, comic, path, field_name) -... method _query_prune_comic_fk_links_comic (line 66) | def _query_prune_comic_fk_links_comic(self, comic, status) -> None: method _query_prune_comic_fk_links_batch (line 82) | def _query_prune_comic_fk_links_batch( method query_prune_comic_fk_links (line 93) | def query_prune_comic_fk_links(self, status) -> None: FILE: codex/librarian/scribe/importer/query/links_m2m.py class QueryPruneLinksM2M (line 19) | class QueryPruneLinksM2M(QueryPruneLinksFKs): method _m2m_obj_to_key_tuple (line 23) | def _m2m_obj_to_key_tuple(key_attrs: tuple[str, ...], m2m_obj: BaseMod... method _query_prune_comic_m2m_links_field_obj (line 33) | def _query_prune_comic_m2m_links_field_obj( method _query_prune_comic_m2m_links_field (line 57) | def _query_prune_comic_m2m_links_field( method _query_prune_comic_m2m_links_comic (line 78) | def _query_prune_comic_m2m_links_comic(self, comic: Comic, status) -> ... method _query_prune_comic_m2m_links_batch (line 85) | def _query_prune_comic_m2m_links_batch(self, paths: tuple[str], status... method query_prune_comic_m2m_links (line 94) | def query_prune_comic_m2m_links(self, status) -> None: FILE: codex/librarian/scribe/importer/query/update_comics.py class QueryUpdateComics (line 20) | class QueryUpdateComics(QueryForeignKeysQueryImporter): method _query_update_comic (line 23) | def _query_update_comic(self, comic: Comic, status: Status) -> None: method query_update_comics (line 41) | def query_update_comics(self) -> None: FILE: codex/librarian/scribe/importer/query/update_fks.py class QueryIsUpdateImporter (line 12) | class QueryIsUpdateImporter(QueryForeignKeysFilterImporter): method _query_missing_models_is_do_update_identifier (line 16) | def _query_missing_models_is_do_update_identifier( method _query_missing_models_is_do_update_extra (line 43) | def _query_missing_models_is_do_update_extra( method _query_normalize_existing_values (line 70) | def _query_normalize_existing_values( method _query_update_init_best_and_existing_values (line 80) | def _query_update_init_best_and_existing_values( method query_model_best_extra_values (line 101) | def query_model_best_extra_values( FILE: codex/librarian/scribe/importer/read/__init__.py class ReadMetadataImporter (line 8) | class ReadMetadataImporter(ExtractMetadataImporter): method read (line 11) | def read(self) -> None: FILE: codex/librarian/scribe/importer/read/aggregate_path.py class AggregateMetadataImporter (line 79) | class AggregateMetadataImporter(AggregatePathMetadataImporter): method _transform_metadata (line 83) | def _transform_metadata(md) -> None: method _aggregate_path (line 102) | def _aggregate_path(self, path, status) -> None: method aggregate_metadata (line 120) | def aggregate_metadata( FILE: codex/librarian/scribe/importer/read/extract.py class ExtractMetadataImporter (line 25) | class ExtractMetadataImporter(AggregateMetadataImporter): method _old_comic_values (line 29) | def _old_comic_values( method _set_import_metadata_flag (line 42) | def _set_import_metadata_flag(self) -> bool: method _extract_path_comicbox (line 53) | def _extract_path_comicbox( method _extract_path (line 91) | def _extract_path( method _get_all_old_comic_values (line 120) | def _get_all_old_comic_values(all_paths: frozenset[str]) -> MappingPro... method extract_metadata (line 131) | def extract_metadata(self, status=None) -> int: FILE: codex/librarian/scribe/importer/read/folders.py class AggregatePathMetadataImporter (line 17) | class AggregatePathMetadataImporter(AggregateManyToManyMetadataImporter): method get_all_library_relative_paths (line 20) | def get_all_library_relative_paths( method get_path_metadata (line 34) | def get_path_metadata(self, md: dict, path: Path | str) -> None: FILE: codex/librarian/scribe/importer/read/foreign_keys.py class AggregateForeignKeyMetadataImporter (line 40) | class AggregateForeignKeyMetadataImporter(QueryForeignKeysImporter): method add_query_model (line 43) | def add_query_model( method get_identifier_tuple (line 60) | def get_identifier_tuple( method _set_simple_fk (line 95) | def _set_simple_fk(self, related_field: Field, value) -> tuple: method _set_group_tree_group (line 101) | def _set_group_tree_group( method get_fk_metadata (line 134) | def get_fk_metadata(self, md, path) -> None: FILE: codex/librarian/scribe/importer/read/many_to_many.py class AggregateManyToManyMetadataImporter (line 35) | class AggregateManyToManyMetadataImporter(AggregateForeignKeyMetadataImp... method _get_m2m_metadata_dict_model_aggregate_sub_sub_value_identifiers (line 38) | def _get_m2m_metadata_dict_model_aggregate_sub_sub_value_identifiers( method _get_m2m_metadata_dict_model_aggregate_sub_sub_value_roles (line 45) | def _get_m2m_metadata_dict_model_aggregate_sub_sub_value_roles( method _get_m2m_metadata_dict_model_aggregate_sub_sub_value (line 61) | def _get_m2m_metadata_dict_model_aggregate_sub_sub_value( method _get_m2m_metadata_aggregate_sub_values_init (line 95) | def _get_m2m_metadata_aggregate_sub_values_init( method _get_roles_or_numbers (line 129) | def _get_roles_or_numbers( method _create_clean_sub_map (line 157) | def _create_clean_sub_map( method _get_m2m_metadata_dict_model_aggregate_sub_values (line 192) | def _get_m2m_metadata_dict_model_aggregate_sub_values( method _get_m2m_metadata_dict_model (line 221) | def _get_m2m_metadata_dict_model( method _get_m2m_metadata_for_field (line 248) | def _get_m2m_metadata_for_field(self, field, md, m2m_md) -> None: method get_m2m_metadata (line 268) | def get_m2m_metadata(self, md, path) -> None: FILE: codex/librarian/scribe/importer/search/__init__.py class SearchIndexImporter (line 16) | class SearchIndexImporter(SearchIndexPrepareImporter): method clean_fts (line 19) | def clean_fts(self) -> int: method full_text_search (line 26) | def full_text_search(self) -> None: FILE: codex/librarian/scribe/importer/search/prepare.py class SearchIndexPrepareImporter (line 19) | class SearchIndexPrepareImporter(SearchIndexCreateUpdateImporter): method minify_complex_link_to_fts_tuple (line 23) | def minify_complex_link_to_fts_tuple( method _to_fts_tuple (line 34) | def _to_fts_tuple(values) -> tuple: method add_to_fts_existing (line 39) | def add_to_fts_existing(self, pk: int, field_name: str, values: tuple)... method add_links_to_fts (line 51) | def add_links_to_fts( FILE: codex/librarian/scribe/importer/search/sync_m2m.py class SearchIndexSyncManyToManyImporter (line 14) | class SearchIndexSyncManyToManyImporter(FinishImporter): method _to_fts_str (line 18) | def _to_fts_str(values) -> str: method _get_fts_m2m_concat (line 22) | def _get_fts_m2m_concat(field_name: str) -> Concat | GroupConcat: method _sync_fts_for_m2m_updates_model (line 44) | def _sync_fts_for_m2m_updates_model( method sync_fts_for_m2m_updates (line 69) | def sync_fts_for_m2m_updates( FILE: codex/librarian/scribe/importer/search/update.py class SearchIndexCreateUpdateImporter (line 27) | class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter): method _create_comicfts_entry (line 30) | def _create_comicfts_entry( method _update_comicfts_entry (line 46) | def _update_comicfts_entry( method _update_search_index_operate_get_status (line 68) | def _update_search_index_operate_get_status( method _update_search_index_operate_create (line 74) | def _update_search_index_operate_create( method _update_search_index_operate_update (line 87) | def _update_search_index_operate_update( method _update_search_index_create_or_update (line 105) | def _update_search_index_create_or_update( method _update_search_index_operate (line 126) | def _update_search_index_operate(self, *, create: bool) -> int: method _update_search_index_update (line 169) | def _update_search_index_update(self) -> int: method _update_search_index_create (line 173) | def _update_search_index_create(self) -> int: method _update_search_index (line 177) | def _update_search_index(self, cleaned_count: int) -> None: method import_search_index (line 202) | def import_search_index(self, cleaned_count: int) -> None: FILE: codex/librarian/scribe/importer/statii/create.py class ImporterCreateStatus (line 8) | class ImporterCreateStatus(ImporterStatus, ABC): class ImporterCreateTagsStatus (line 12) | class ImporterCreateTagsStatus(ImporterCreateStatus): class ImporterUpdateTagsStatus (line 20) | class ImporterUpdateTagsStatus(ImporterCreateStatus): class ImporterCreateComicsStatus (line 28) | class ImporterCreateComicsStatus(ImporterCreateStatus): class ImporterUpdateComicsStatus (line 36) | class ImporterUpdateComicsStatus(ImporterCreateStatus): class ImporterCreateCoversStatus (line 44) | class ImporterCreateCoversStatus(ImporterCreateStatus): class ImporterUpdateCoversStatus (line 52) | class ImporterUpdateCoversStatus(ImporterCreateStatus): FILE: codex/librarian/scribe/importer/statii/delete.py class ImporterRemoveStatus (line 8) | class ImporterRemoveStatus(ImporterStatus, ABC): class ImporterRemoveFoldersStatus (line 14) | class ImporterRemoveFoldersStatus(ImporterRemoveStatus): class ImporterRemoveComicsStatus (line 21) | class ImporterRemoveComicsStatus(ImporterRemoveStatus): class ImporterRemoveCoversStatus (line 28) | class ImporterRemoveCoversStatus(ImporterRemoveStatus): FILE: codex/librarian/scribe/importer/statii/failed.py class ImporterFailedImportStatus (line 8) | class ImporterFailedImportStatus(ImporterStatus, ABC): class ImporterFailedImportsQueryStatus (line 14) | class ImporterFailedImportsQueryStatus(ImporterFailedImportStatus): class ImporterFailedImportsUpdateStatus (line 22) | class ImporterFailedImportsUpdateStatus(ImporterFailedImportStatus): class ImporterFailedImportsCreateStatus (line 29) | class ImporterFailedImportsCreateStatus(ImporterFailedImportStatus): class ImporterFailedImportsDeleteStatus (line 37) | class ImporterFailedImportsDeleteStatus(ImporterFailedImportStatus): FILE: codex/librarian/scribe/importer/statii/link.py class ImporterLinkStatus (line 6) | class ImporterLinkStatus(ImporterStatus): class ImporterLinkTagsStatus (line 13) | class ImporterLinkTagsStatus(ImporterLinkStatus): class ImporterLinkCoversStatus (line 20) | class ImporterLinkCoversStatus(ImporterLinkStatus): FILE: codex/librarian/scribe/importer/statii/moved.py class ImporterMoveStatus (line 8) | class ImporterMoveStatus(ImporterStatus, ABC): class ImporterMoveFoldersStatus (line 14) | class ImporterMoveFoldersStatus(ImporterMoveStatus): class ImporterMoveComicsStatus (line 21) | class ImporterMoveComicsStatus(ImporterMoveStatus): class ImporterMoveCoversStatus (line 28) | class ImporterMoveCoversStatus(ImporterMoveStatus): FILE: codex/librarian/scribe/importer/statii/query.py class ImporterQueryStatus (line 6) | class ImporterQueryStatus(ImporterStatus): class ImporterQueryMissingTagsStatus (line 13) | class ImporterQueryMissingTagsStatus(ImporterQueryStatus): class ImporterQueryComicUpdatesStatus (line 20) | class ImporterQueryComicUpdatesStatus(ImporterQueryStatus): class ImporterQueryTagLinksStatus (line 27) | class ImporterQueryTagLinksStatus(ImporterQueryStatus): class ImporterQueryMissingCoversStatus (line 34) | class ImporterQueryMissingCoversStatus(ImporterQueryStatus): FILE: codex/librarian/scribe/importer/statii/read.py class ImporterReadStatus (line 8) | class ImporterReadStatus(ImporterStatus, ABC): class ImporterReadComicsStatus (line 14) | class ImporterReadComicsStatus(ImporterReadStatus): class ImporterAggregateStatus (line 22) | class ImporterAggregateStatus(ImporterReadStatus): FILE: codex/librarian/scribe/importer/statii/search.py class ImporterFTSStatus (line 8) | class ImporterFTSStatus(ImporterStatus, ABC): class ImporterFTSUpdateStatus (line 14) | class ImporterFTSUpdateStatus(ImporterFTSStatus): class ImporterFTSCreateStatus (line 21) | class ImporterFTSCreateStatus(ImporterFTSStatus): FILE: codex/librarian/scribe/importer/status.py class ImporterStatus (line 8) | class ImporterStatus(ScribeStatus, ABC): FILE: codex/librarian/scribe/importer/tasks.py class ImportTask (line 10) | class ImportTask(ScribeTask): method total (line 35) | def total(self) -> int: FILE: codex/librarian/scribe/janitor/adopt_folders.py class OrphanFolderAdopter (line 15) | class OrphanFolderAdopter(WorkerStatusAbortableBase): method _adopt_orphan_folders_for_library (line 18) | def _adopt_orphan_folders_for_library(self, library) -> tuple | tuple[... method adopt_orphan_folders (line 48) | def adopt_orphan_folders(self) -> None: FILE: codex/librarian/scribe/janitor/cleanup.py function _create_reverse_rel_map_for_model (line 80) | def _create_reverse_rel_map_for_model(model, rel_map) -> None: function _create_reverse_rel_map (line 101) | def _create_reverse_rel_map() -> MappingProxyType: class JanitorCleanup (line 117) | class JanitorCleanup(JanitorUpdateFailedImports): method _cleanup_fks_model (line 120) | def _cleanup_fks_model(self, model, filter_dict, status): method _cleanup_fks_one_level (line 129) | def _cleanup_fks_one_level(self, status) -> int: method cleanup_fks (line 137) | def cleanup_fks(self) -> None: method cleanup_custom_covers (line 156) | def cleanup_custom_covers(self) -> None: method cleanup_sessions (line 174) | def cleanup_sessions(self) -> None: method cleanup_orphan_bookmarks (line 196) | def cleanup_orphan_bookmarks(self) -> None: method cleanup_orphan_settings (line 208) | def cleanup_orphan_settings(self) -> None: FILE: codex/librarian/scribe/janitor/failed_imports.py class JanitorUpdateFailedImports (line 9) | class JanitorUpdateFailedImports(JanitorVacuum): method _force_update_failed_imports (line 12) | def _force_update_failed_imports(self, library_id) -> None: method force_update_all_failed_imports (line 22) | def force_update_all_failed_imports(self) -> None: FILE: codex/librarian/scribe/janitor/integrity/__init__.py function _exec_sql (line 21) | def _exec_sql(sql): function _is_integrity_ok (line 31) | def _is_integrity_ok(results) -> bool: function integrity_check (line 37) | def integrity_check(log, *, long: bool) -> None: function fts_rebuild (line 55) | def fts_rebuild() -> None: function fts_integrity_check (line 61) | def fts_integrity_check(log) -> bool: class JanitorIntegrity (line 80) | class JanitorIntegrity(WorkerStatusAbortableBase): method foreign_key_check (line 83) | def foreign_key_check(self) -> None: method integrity_check (line 93) | def integrity_check(self, *, long: bool) -> None: method fts_rebuild (line 104) | def fts_rebuild(self) -> None: method fts_integrity_check (line 114) | def fts_integrity_check(self) -> None: FILE: codex/librarian/scribe/janitor/integrity/foreign_keys.py function _get_fk_column_name (line 16) | def _get_fk_column_name(cursor, table_name: str, fkid: int) -> str | None: function _is_column_nullable (line 26) | def _is_column_nullable(cursor, table_name: str, column_name: str) -> bool: function _collect_comic_ids_for_table (line 36) | def _collect_comic_ids_for_table(cursor, table_name: str, rowids: set) -... function _mark_comics_for_update (line 57) | def _mark_comics_for_update(fix_comic_pks, log) -> None: function _group_fk_violations (line 86) | def _group_fk_violations( function _fix_fk_violations (line 120) | def _fix_fk_violations( function fix_foreign_keys (line 162) | def fix_foreign_keys(log) -> None: FILE: codex/librarian/scribe/janitor/janitor.py class Janitor (line 106) | class Janitor(JanitorCodexUpdate): method queue_nightly_tasks (line 109) | def queue_nightly_tasks(self) -> None: method handle_task (line 119) | def handle_task(self, task) -> None: FILE: codex/librarian/scribe/janitor/scheduled_time.py function get_janitor_time (line 9) | def get_janitor_time(_log: Logger) -> datetime: FILE: codex/librarian/scribe/janitor/status.py class JanitorStatus (line 8) | class JanitorStatus(ScribeStatus, ABC): class JanitorAdoptOrphanFoldersStatus (line 12) | class JanitorAdoptOrphanFoldersStatus(JanitorStatus): class JanitorCleanupTagsStatus (line 21) | class JanitorCleanupTagsStatus(JanitorStatus): class JanitorCodexLatestVersionStatus (line 30) | class JanitorCodexLatestVersionStatus(JanitorStatus): class JanitorCodexUpdateStatus (line 40) | class JanitorCodexUpdateStatus(JanitorStatus): class JanitorDBOptimizeStatus (line 50) | class JanitorDBOptimizeStatus(JanitorStatus): class JanitorDBBackupStatus (line 60) | class JanitorDBBackupStatus(JanitorStatus): class JanitorCleanupSessionsStatus (line 70) | class JanitorCleanupSessionsStatus(JanitorStatus): class JanitorCleanupCoversStatus (line 79) | class JanitorCleanupCoversStatus(JanitorStatus): class JanitorCleanupBookmarksStatus (line 88) | class JanitorCleanupBookmarksStatus(JanitorStatus): class JanitorCleanupSettingsStatus (line 97) | class JanitorCleanupSettingsStatus(JanitorStatus): class JanitorDBFKIntegrityStatus (line 106) | class JanitorDBFKIntegrityStatus(JanitorStatus): class JanitorDBIntegrityStatus (line 116) | class JanitorDBIntegrityStatus(JanitorStatus): class JanitorDBFTSIntegrityStatus (line 126) | class JanitorDBFTSIntegrityStatus(JanitorStatus): class JanitorDBFTSRebuildStatus (line 136) | class JanitorDBFTSRebuildStatus(JanitorStatus): FILE: codex/librarian/scribe/janitor/tasks.py class JanitorTask (line 8) | class JanitorTask(ScribeTask): class JanitorCodexUpdateTask (line 13) | class JanitorCodexUpdateTask(JanitorTask): class JanitorAdoptOrphanFoldersTask (line 19) | class JanitorAdoptOrphanFoldersTask(JanitorTask): class JanitorBackupTask (line 23) | class JanitorBackupTask(JanitorTask): class JanitorVacuumTask (line 27) | class JanitorVacuumTask(JanitorTask): class JanitorCleanFKsTask (line 31) | class JanitorCleanFKsTask(JanitorTask): class JanitorCleanCoversTask (line 35) | class JanitorCleanCoversTask(JanitorTask): class JanitorCleanupSessionsTask (line 39) | class JanitorCleanupSessionsTask(JanitorTask): class JanitorCleanupBookmarksTask (line 43) | class JanitorCleanupBookmarksTask(JanitorTask): class JanitorCleanupSettingsTask (line 47) | class JanitorCleanupSettingsTask(JanitorTask): class JanitorForeignKeyCheckTask (line 51) | class JanitorForeignKeyCheckTask(JanitorTask): class JanitorImportForceAllFailedTask (line 55) | class JanitorImportForceAllFailedTask(JanitorTask): class JanitorIntegrityCheckTask (line 60) | class JanitorIntegrityCheckTask(JanitorTask): class JanitorFTSIntegrityCheckTask (line 66) | class JanitorFTSIntegrityCheckTask(JanitorTask): class JanitorFTSRebuildTask (line 70) | class JanitorFTSRebuildTask(JanitorTask): class JanitorNightlyTask (line 74) | class JanitorNightlyTask(JanitorTask): FILE: codex/librarian/scribe/janitor/update.py class JanitorCodexUpdate (line 17) | class JanitorCodexUpdate(JanitorCleanup): method _is_outdated (line 20) | def _is_outdated(self) -> bool: method _update_codex (line 42) | def _update_codex(self, *, force: bool) -> None: method update_codex (line 68) | def update_codex(self, *, force: bool) -> None: FILE: codex/librarian/scribe/janitor/vacuum.py class JanitorVacuum (line 16) | class JanitorVacuum(JanitorIntegrity): method vacuum_db (line 19) | def vacuum_db(self) -> None: method backup_db (line 35) | def backup_db(self, backup_path=BACKUP_DB_PATH, *, show_status: bool) ... FILE: codex/librarian/scribe/lazy_importer.py class LazyImporter (line 10) | class LazyImporter(WorkerBase): method lazy_import (line 13) | def lazy_import(self, task) -> None: FILE: codex/librarian/scribe/priority.py function get_task_priority (line 67) | def get_task_priority(task: ScribeTask) -> tuple[int, float]: FILE: codex/librarian/scribe/scribed.py class ScribeThread (line 40) | class ScribeThread(QueuedThread): method __init__ (line 45) | def __init__(self, *args, **kwargs) -> None: method process_item (line 53) | def process_item(self, item) -> None: method put (line 103) | def put(self, task) -> None: FILE: codex/librarian/scribe/search/handler.py class SearchIndexer (line 13) | class SearchIndexer(SearchIndexerSync): method handle_task (line 16) | def handle_task(self, task: SearchIndexerTask) -> None: FILE: codex/librarian/scribe/search/optimize.py class SearchIndexerOptimize (line 14) | class SearchIndexerOptimize(WorkerStatusAbortableBase): method optimize (line 17) | def optimize(self) -> None: FILE: codex/librarian/scribe/search/prepare.py class SearchEntryPrepare (line 47) | class SearchEntryPrepare: method _get_entry_str_value (line 51) | def _get_entry_str_value(entry: dict, key: str) -> str: method _get_sources_fts_field (line 62) | def _get_sources_fts_field(entry: dict) -> str: method _get_pycountry_fts_field (line 80) | def _get_pycountry_fts_field(cls, entry, field_name) -> str: method _create_comicfts_entry_attributes (line 88) | def _create_comicfts_entry_attributes(cls, entry, *, create: bool) -> ... method _create_comicfts_entry_fks (line 95) | def _create_comicfts_entry_fks(cls, entry) -> None: method _create_comicfts_entry_m2ms (line 100) | def _create_comicfts_entry_m2ms(cls, entry, existing_values: dict | No... method prepare_import_fts_entry (line 109) | def prepare_import_fts_entry( method prepare_sync_fts_entry (line 141) | def prepare_sync_fts_entry( FILE: codex/librarian/scribe/search/remove.py class SearchIndexerRemove (line 13) | class SearchIndexerRemove(SearchIndexerOptimize): method clear_search_index (line 16) | def clear_search_index(self) -> None: method _remove_stale_records (line 23) | def _remove_stale_records(self, status): method remove_stale_records (line 38) | def remove_stale_records(self, *, log_success: bool = True) -> int: method remove_duplicate_records (line 50) | def remove_duplicate_records(self) -> int: FILE: codex/librarian/scribe/search/status.py class SearchIndexStatus (line 8) | class SearchIndexStatus(ScribeStatus, ABC): class SearchIndexClearStatus (line 12) | class SearchIndexClearStatus(SearchIndexStatus): class SearchIndexCleanStatus (line 23) | class SearchIndexCleanStatus(SearchIndexStatus): class SearchIndexOptimizeStatus (line 32) | class SearchIndexOptimizeStatus(SearchIndexStatus): class SearchIndexSyncUpdateStatus (line 42) | class SearchIndexSyncUpdateStatus(SearchIndexStatus): class SearchIndexSyncCreateStatus (line 51) | class SearchIndexSyncCreateStatus(SearchIndexStatus): FILE: codex/librarian/scribe/search/sync.py class SearchIndexerSync (line 78) | class SearchIndexerSync(SearchIndexerRemove): method _init_statuses (line 81) | def _init_statuses(self, rebuild) -> None: method _update_search_index_clean (line 98) | def _update_search_index_clean(self, rebuild) -> None: method _select_related_fts_query (line 107) | def _select_related_fts_query(qs): method _prefetch_related_fts_query (line 119) | def _prefetch_related_fts_query(qs): method _annotate_fts_query (line 139) | def _annotate_fts_query(qs): method _update_search_index_operate_get_status (line 156) | def _update_search_index_operate_get_status( method _update_search_index_create_or_update (line 165) | def _update_search_index_create_or_update( method _get_operation_comics_query (line 189) | def _get_operation_comics_query(qs, *, create: bool): method _update_search_index_operate (line 194) | def _update_search_index_operate( method _update_search_index_update (line 257) | def _update_search_index_update(self): method _update_search_index_create (line 274) | def _update_search_index_create(self): method _update_search_index (line 286) | def _update_search_index(self, *, rebuild: bool) -> None: method update_search_index (line 318) | def update_search_index(self, *, rebuild: bool) -> None: FILE: codex/librarian/scribe/search/tasks.py class SearchIndexerTask (line 8) | class SearchIndexerTask(ScribeTask): class SearchIndexSyncTask (line 13) | class SearchIndexSyncTask(SearchIndexerTask): class SearchIndexOptimizeTask (line 19) | class SearchIndexOptimizeTask(SearchIndexerTask): class SearchIndexCleanStaleTask (line 23) | class SearchIndexCleanStaleTask(SearchIndexerTask): class SearchIndexClearTask (line 27) | class SearchIndexClearTask(SearchIndexerTask): FILE: codex/librarian/scribe/status.py class ScribeStatus (line 8) | class ScribeStatus(Status, ABC): class UpdateGroupTimestampsStatus (line 12) | class UpdateGroupTimestampsStatus(ScribeStatus): FILE: codex/librarian/scribe/tasks.py class ScribeTask (line 9) | class ScribeTask(LibrarianTask): class UpdateGroupsTask (line 14) | class UpdateGroupsTask(ScribeTask): class LazyImportComicsTask (line 21) | class LazyImportComicsTask(ScribeTask): class ImportAbortTask (line 28) | class ImportAbortTask(ScribeTask): class SearchIndexSyncAbortTask (line 32) | class SearchIndexSyncAbortTask(ScribeTask): class CleanupAbortTask (line 36) | class CleanupAbortTask(ScribeTask): FILE: codex/librarian/scribe/timestamp_update.py class TimestampUpdater (line 23) | class TimestampUpdater(WorkerStatusBase): method _get_update_filter (line 27) | def _get_update_filter( method _add_child_count_filter (line 51) | def _add_child_count_filter(qs: QuerySet, model: type[BrowserGroupMode... method _update_group_model (line 59) | def _update_group_model( method update_library_groups (line 88) | def update_library_groups( method update_groups (line 120) | def update_groups(self, task) -> None: FILE: codex/librarian/status.py class Status (line 12) | class Status(ABC): method title (line 30) | def title(cls) -> str: method verbed (line 39) | def verbed(cls) -> str: method increment_complete (line 45) | def increment_complete(self, count: int = 1) -> None: method decrement_total (line 49) | def decrement_total(self) -> None: method start (line 53) | def start(self) -> None: method _elapsed (line 57) | def _elapsed(self): method elapsed (line 60) | def elapsed(self) -> str: method per_second (line 64) | def per_second(self) -> str: method reset (line 72) | def reset(self) -> None: FILE: codex/librarian/status_controller.py function get_default (line 20) | def get_default(field): class StatusController (line 29) | class StatusController: method __init__ (line 34) | def __init__(self, logger_: Logger, librarian_queue: Queue) -> None: method _enqueue_notifier_task (line 39) | def _enqueue_notifier_task(self, *, notify: bool = True) -> None: method _loggit (line 45) | def _loggit(self, level: str, status: Status) -> None: method _update (line 58) | def _update( method start (line 86) | def start( method start_many (line 97) | def start_many(self, statii: Iterable[Status | type[Status]]) -> None: method update (line 107) | def update(self, status: Status, *, notify: bool = True) -> None: method _log_finish (line 114) | def _log_finish(self, status: Status) -> None: method _finish_many_log (line 140) | def _finish_many_log(self, updated_statii, *, is_positive_statii: bool): method finish_many (line 149) | def finish_many( method finish (line 190) | def finish(self, status: Status | None, *, notify: bool = True) -> None: FILE: codex/librarian/tasks.py class LibrarianTask (line 6) | class LibrarianTask(ABC): # noqa: B024 class LibrarianShutdownTask (line 10) | class LibrarianShutdownTask(LibrarianTask): class WakeCronTask (line 14) | class WakeCronTask(LibrarianTask): FILE: codex/librarian/telemeter/scheduled_time.py function _get_utc_start_of_week (line 19) | def _get_utc_start_of_week(): function _is_created_recently (line 30) | def _is_created_recently(ts) -> bool: function _get_scheduled_time (line 37) | def _get_scheduled_time(ts) -> int | datetime: function get_telemeter_time (line 52) | def get_telemeter_time(log: Logger) -> int | datetime: FILE: codex/librarian/telemeter/stats.py class CodexStats (line 47) | class CodexStats: method __init__ (line 50) | def __init__(self, params=None) -> None: method _is_docker (line 57) | def _is_docker(cls) -> bool: method _get_models (line 64) | def _get_models(self, key) -> tuple: method _get_model_counts (line 79) | def _get_model_counts(self, key) -> dict: method _aggregate_settings_instance (line 92) | def _aggregate_settings_instance(instance, subkeys, user_stats) -> None: method _get_session_stats (line 104) | def _get_session_stats(cls) -> tuple[dict, int]: method _add_platform (line 122) | def _add_platform(self, obj) -> None: method _add_config (line 139) | def _add_config(self, obj) -> None: method _add_groups (line 150) | def _add_groups(self, obj) -> None: method _add_file_types (line 158) | def _add_file_types(self, obj) -> None: method _add_metadata (line 175) | def _add_metadata(self, obj) -> None: method get (line 182) | def get(self) -> dict: FILE: codex/librarian/telemeter/tasks.py class TelemeterTask (line 9) | class TelemeterTask(BookmarkTask): FILE: codex/librarian/telemeter/telemeter.py function get_telemeter_timestamp (line 31) | def get_telemeter_timestamp(): function _post_stats (line 42) | def _post_stats(data) -> None: function _send_telemetry (line 52) | def _send_telemetry(uuid) -> None: function send_telemetry (line 66) | def send_telemetry(log) -> None: FILE: codex/librarian/threads.py class BreakLoopError (line 17) | class BreakLoopError(Exception): class NamedThread (line 21) | class NamedThread(Thread, WorkerStatusMixin, ABC): method __init__ (line 27) | def __init__( method run_start (line 41) | def run_start(self) -> None: method join (line 47) | def join(self, timeout=None) -> None: method stop (line 53) | def stop(self): class QueuedThread (line 58) | class QueuedThread(NamedThread, ABC): method __init__ (line 61) | def __init__(self, *args, **kwargs) -> None: method process_item (line 67) | def process_item(self, item): method get_timeout (line 71) | def get_timeout(self) -> float | None: method timed_out (line 75) | def timed_out(self): method _check_item (line 78) | def _check_item(self) -> None: method run (line 90) | def run(self) -> None: method stop (line 104) | def stop(self) -> None: class AggregateMessageQueuedThread (line 110) | class AggregateMessageQueuedThread(QueuedThread, ABC): method __init__ (line 116) | def __init__(self, *args, **kwargs) -> None: method set_last_send (line 122) | def set_last_send(self) -> None: method get_timeout (line 127) | def get_timeout(self): method aggregate_items (line 132) | def aggregate_items(self, item): method send_all_items (line 137) | def send_all_items(self): method cleanup_cache (line 141) | def cleanup_cache(self, keys) -> None: method process_item (line 148) | def process_item(self, item) -> None: method timed_out (line 157) | def timed_out(self) -> None: FILE: codex/librarian/worker.py class WorkerMixin (line 11) | class WorkerMixin: method init_worker (line 14) | def init_worker( class WorkerStatusMixin (line 26) | class WorkerStatusMixin(WorkerMixin): method init_worker (line 30) | def init_worker(self, /, logger_, librarian_queue: Queue, db_write_loc... class WorkerBase (line 37) | class WorkerBase(WorkerMixin): method __init__ (line 40) | def __init__(self, logger_, librarian_queue: Queue, db_write_lock) -> ... class WorkerStatusBase (line 46) | class WorkerStatusBase(WorkerStatusMixin): method __init__ (line 49) | def __init__(self, logger_, librarian_queue: Queue, db_write_lock) -> ... class WorkerStatusAbortableBase (line 55) | class WorkerStatusAbortableBase(WorkerStatusBase): method __init__ (line 58) | def __init__(self, logger_, librarian_queue: Queue, db_write_lock, eve... FILE: codex/middleware.py class CodexMiddleware (line 19) | class CodexMiddleware: method __init__ (line 22) | def __init__(self, get_response): method __call__ (line 26) | def __call__(self, request): class LogResponseTimeMiddleware (line 41) | class LogResponseTimeMiddleware: method __init__ (line 44) | def __init__(self, get_response) -> None: method _log_response_time (line 48) | def _log_response_time(self, request): method _log_query_times (line 63) | def _log_query_times(self) -> None: method __call__ (line 74) | def __call__(self, request) -> Any: class LogRequestMiddleware (line 81) | class LogRequestMiddleware: method __init__ (line 84) | def __init__(self, get_response) -> None: method _log_auth_headers (line 88) | def _log_auth_headers(self, request) -> None: method __call__ (line 106) | def __call__(self, request) -> Any: FILE: codex/migrations/0001_init.py class Migration (line 13) | class Migration(migrations.Migration): FILE: codex/migrations/0002_auto_20200826_0622.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0003_auto_20200831_2033.py class Migration (line 7) | class Migration(migrations.Migration): FILE: codex/migrations/0004_failedimport.py class Migration (line 7) | class Migration(migrations.Migration): FILE: codex/migrations/0005_auto_20200918_0146.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0006_update_default_names_and_remove_duplicate_comics.py function update_default_names (line 19) | def update_default_names(apps, _schema_editor) -> None: function remove_duplicate_comics (line 31) | def remove_duplicate_comics(apps, _schema_editor) -> None: class Migration (line 62) | class Migration(migrations.Migration): FILE: codex/migrations/0007_auto_20211210_1710.py class Migration (line 9) | class Migration(migrations.Migration): FILE: codex/migrations/0008_alter_comic_created_at_alter_comic_format_and_more.py class Migration (line 7) | class Migration(migrations.Migration): FILE: codex/migrations/0009_alter_comic_parent_folder.py class Migration (line 7) | class Migration(migrations.Migration): FILE: codex/migrations/0010_haystack.py class Migration (line 7) | class Migration(migrations.Migration): FILE: codex/migrations/0011_library_groups_and_metadata_changes.py function critical_rating_to_decimal (line 8) | def critical_rating_to_decimal(apps, _schema_editor) -> None: class Migration (line 28) | class Migration(migrations.Migration): FILE: codex/migrations/0012_rename_description_comic_comments.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0013_int_issue_count_longer_charfields.py function cast_issue_count (line 8) | def cast_issue_count(apps, _schema_editor) -> None: class Migration (line 29) | class Migration(migrations.Migration): FILE: codex/migrations/0014_pdf_issue_suffix_remove_cover_image_sort_name.py function add_library_folders (line 8) | def add_library_folders(apps, _schema_editor) -> None: class Migration (line 73) | class Migration(migrations.Migration): FILE: codex/migrations/0015_link_comics_to_top_level_folders.py function fix_no_parent_folder_comics (line 8) | def fix_no_parent_folder_comics(apps, _schema_editor) -> None: class Migration (line 33) | class Migration(migrations.Migration): FILE: codex/migrations/0016_remove_comic_cover_path_librarianstatus.py function copy_versions_to_timestamp (line 15) | def copy_versions_to_timestamp(apps, _schema_editor) -> None: function remove_old_caches (line 30) | def remove_old_caches(_apps, _schema_editor) -> None: class Migration (line 42) | class Migration(migrations.Migration): FILE: codex/migrations/0017_alter_timestamp_options_alter_adminflag_name_and_more.py function clear_covers (line 15) | def clear_covers(_apps, _schema_editor) -> None: function remove_null_librarian_statuses (line 20) | def remove_null_librarian_statuses(apps, _schema_editor) -> None: class Migration (line 26) | class Migration(migrations.Migration): FILE: codex/migrations/0018_rename_userbookmark_bookmark.py class Migration (line 7) | class Migration(migrations.Migration): FILE: codex/migrations/0019_delete_queuejob.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0020_remove_search_tables.py function rename_search_timestamp (line 6) | def rename_search_timestamp(apps, _schema_editor) -> None: class Migration (line 12) | class Migration(migrations.Migration): FILE: codex/migrations/0021_bookmark_fit_to_choices_read_in_reverse.py function ensure_fit_to_has_valid_choices (line 6) | def ensure_fit_to_has_valid_choices(apps, _schema_editor) -> None: class Migration (line 13) | class Migration(migrations.Migration): FILE: codex/migrations/0022_bookmark_vertical_useractive_null_statuses.py class Migration (line 8) | class Migration(migrations.Migration): FILE: codex/migrations/0023_rename_credit_creator_and_more.py function prepare_librarianstatus (line 10) | def prepare_librarianstatus(apps, _schema_editor) -> None: function prepare_bookmarks (line 22) | def prepare_bookmarks(apps, _schema_editor) -> None: function prepare_comics (line 31) | def prepare_comics(apps, _schema_editor) -> None: function prepare_adminflags (line 49) | def prepare_adminflags(apps, _schema_editor) -> None: function prepare_timestamps (line 73) | def prepare_timestamps(apps, _schema_editor) -> None: class Migration (line 99) | class Migration(migrations.Migration): FILE: codex/migrations/0024_comic_gtin_comic_story_arc_number.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0025_add_story_arc_number.py function _create_story_arc_numbers (line 7) | def _create_story_arc_numbers(apps, _schema_editor) -> None: class Migration (line 33) | class Migration(migrations.Migration): FILE: codex/migrations/0026_comicbox_1.py function _migrate_comments (line 25) | def _migrate_comments(apps, _schema_editor) -> None: function _migrate_reading_direction (line 35) | def _migrate_reading_direction(apps, _schema_editor) -> None: function _get_pycountry_alpha_2 (line 45) | def _get_pycountry_alpha_2(val, lookup) -> str: function _create_new_rows (line 51) | def _create_new_rows(comic_model, model, field_name, model_name) -> dict: function _link_rows_to_comic (line 79) | def _link_rows_to_comic(comic_model, model, field_name, model_name, name... function _migrate_fields_to_tables (line 95) | def _migrate_fields_to_tables(apps, _schema_editor) -> None: function _migrate_bookmark (line 104) | def _migrate_bookmark(apps, _schema_editor) -> None: function _migrate_gtin_to_ids_scan (line 130) | def _migrate_gtin_to_ids_scan(comics) -> tuple[dict, dict]: function _migrate_gtin_to_ids_create_id_types (line 148) | def _migrate_gtin_to_ids_create_id_types(identifier_type_model, identifi... function _migrate_gtin_to_ids_create_ids (line 159) | def _migrate_gtin_to_ids_create_ids( function _migrate_gtin_to_ids_link_comics (line 174) | def _migrate_gtin_to_ids_link_comics( function _migrate_gtin_to_identifiers (line 190) | def _migrate_gtin_to_identifiers(apps, _schema_editor) -> None: function _migrate_volume_name (line 210) | def _migrate_volume_name(apps, _schema_editor) -> None: function _clear_search_index_uuid (line 226) | def _clear_search_index_uuid(apps, _schema_editor) -> None: class Migration (line 232) | class Migration(migrations.Migration): FILE: codex/migrations/0027_import_order_and_covers.py function _set_sort_name (line 24) | def _set_sort_name(obj) -> None: function _generate_sort_name (line 29) | def _generate_sort_name(apps, _schema_editor) -> None: function _remove_cover_symlinks (line 45) | def _remove_cover_symlinks(_apps, _schema_editor) -> None: class Migration (line 61) | class Migration(migrations.Migration): FILE: codex/migrations/0028_telemeter.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0029_comicfts.py class Migration (line 7) | class Migration(migrations.Migration): FILE: codex/migrations/0030_nocase_collation_day_month_indexes_status_types.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0031_adminflag_banner.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0032_alter_librarianstatus_preactive.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0033_alter_librarianstatus_status_type.py class Migration (line 6) | class Migration(migrations.Migration): FILE: codex/migrations/0034_comicbox2.py class Migration (line 10) | class Migration(migrations.Migration): FILE: codex/migrations/0035_fts_optmize.py function _map_identifiers_to_canonical_names (line 10) | def _map_identifiers_to_canonical_names(apps) -> dict: function _prepare_canonical_id_sources (line 26) | def _prepare_canonical_id_sources(apps, identifier_source_map) -> tuple: function _create_link_map (line 43) | def _create_link_map(identifier_source_map, sources) -> dict: function _prepare_updatatable_identifiers (line 51) | def _prepare_updatatable_identifiers(apps, identifier_source_map, source... function _create_canonical_sources (line 62) | def _create_canonical_sources(apps) -> tuple[dict, tuple]: function _update_identifiers_with_canonical_sources (line 76) | def _update_identifiers_with_canonical_sources( function _convert_identifier_sources (line 87) | def _convert_identifier_sources(apps, _schema_editor) -> None: class Migration (line 92) | class Migration(migrations.Migration): FILE: codex/migrations/0036_alter_comic_path_alter_customcover_path_and_more.py class Migration (line 8) | class Migration(migrations.Migration): FILE: codex/migrations/0037_redefine_reading_direction_filetype_choices.py class Migration (line 8) | class Migration(migrations.Migration): FILE: codex/migrations/0038_settings_tables.py function create_default_show_row (line 71) | def create_default_show_row(apps, _schema_editor): function _get_or_create_show (line 77) | def _get_or_create_show(show_model, show_dict): function _create_browser_filters (line 84) | def _create_browser_filters(filters_model, browser, settings_dict): function _create_browser_last_route (line 98) | def _create_browser_last_route(route_model, browser, settings_dict): function _migrate_browser_session (line 112) | def _migrate_browser_session(settings_dict, model_map, client, user, ses... function _migrate_reader_session (line 158) | def _migrate_reader_session(settings_dict, model_map, client, user, sess... function _get_user (line 188) | def _get_user(user_model, session_data): function migrate_session_forward_model (line 199) | def migrate_session_forward_model( function migrate_session_forward (line 211) | def migrate_session_forward( function migrate_sessions_forward (line 243) | def migrate_sessions_forward(apps, _schema_editor): class Migration (line 269) | class Migration(migrations.Migration): FILE: codex/models/admin.py class AdminFlag (line 28) | class AdminFlag(BaseModel): class Meta (line 41) | class Meta(BaseModel.Meta): class LibrarianStatus (line 47) | class LibrarianStatus(BaseModel): class Meta (line 65) | class Meta(BaseModel.Meta): class Timestamp (line 72) | class Timestamp(BaseModel): class Choices (line 75) | class Choices(TextChoices): method touch (line 91) | def touch(cls, choice) -> None: method save_uuid_version (line 95) | def save_uuid_version(self) -> None: class Meta (line 102) | class Meta(BaseModel.Meta): method __repr__ (line 108) | def __repr__(self) -> str: class UserActive (line 113) | class UserActive(BaseModel): class GroupAuth (line 119) | class GroupAuth(BaseModel): FILE: codex/models/base.py class BaseModel (line 19) | class BaseModel(Model): class Meta (line 26) | class Meta(ModelBase): method presave (line 34) | def presave(self): class NamedModel (line 38) | class NamedModel(BaseModel): class Meta (line 43) | class Meta(BaseModel.Meta): method __repr__ (line 50) | def __repr__(self) -> str: FILE: codex/models/bookmark.py function cascade_if_user_null (line 18) | def cascade_if_user_null( class Bookmark (line 47) | class Bookmark(BaseModel): class Meta (line 60) | class Meta(BaseModel.Meta): FILE: codex/models/choices.py function _prepare_text_choices_class_dict (line 12) | def _prepare_text_choices_class_dict(class_name: str) -> _EnumDict: function _create_text_choices_class (line 17) | def _create_text_choices_class( function text_choices_from_enum (line 25) | def text_choices_from_enum( function text_choices_from_map (line 38) | def text_choices_from_map(choices_map: Mapping, class_name: str) -> type... function text_choices_from_string (line 46) | def text_choices_from_string(string: str, class_name: str) -> type[TextC... function max_choices_len (line 54) | def max_choices_len(choices: type[Choices]) -> int: FILE: codex/models/comic.py class Comic (line 71) | class Comic(WatchedPathBrowserGroup): class Meta (line 208) | class Meta(WatchedPathBrowserGroup.Meta): method _set_date (line 213) | def _set_date(self) -> None: method _set_decade (line 226) | def _set_decade(self) -> None: method presave (line 234) | def presave(self) -> None: method max_page (line 242) | def max_page(self): method _compute_zero_pad (line 247) | def _compute_zero_pad(issue_number_max) -> int: method get_filename (line 255) | def get_filename(self) -> str: method _get_title_issue_str (line 260) | def _get_title_issue_str(cls, obj, zero_pad) -> str: method get_title (line 278) | def get_title( method __repr__ (line 311) | def __repr__(self) -> str: class ComicFTS (line 316) | class ComicFTS(BaseModel): class Meta (line 347) | class Meta(BaseModel.Meta): FILE: codex/models/fields.py class CleaningStringFieldMixin (line 17) | class CleaningStringFieldMixin: method get_prep_value (line 20) | def get_prep_value(self, value): class CleaningCharField (line 29) | class CleaningCharField(CleaningStringFieldMixin, CharField): class CleaningTextField (line 33) | class CleaningTextField(CleaningStringFieldMixin, TextField): class CoercingSmallIntegerFieldMixin (line 37) | class CoercingSmallIntegerFieldMixin: method get_prep_value (line 43) | def get_prep_value(self, value): class CoercingSmallIntegerField (line 51) | class CoercingSmallIntegerField(CoercingSmallIntegerFieldMixin, SmallInt... class CoercingPositiveSmallIntegerField (line 55) | class CoercingPositiveSmallIntegerField( class CoercingDecimalField (line 63) | class CoercingDecimalField(DecimalField): method __init__ (line 66) | def __init__(self, *args, **kwargs) -> None: method get_prep_value (line 73) | def get_prep_value(self, value) -> Any: FILE: codex/models/functions.py class JsonGroupArray (line 15) | class JsonGroupArray(Aggregate): method __init__ (line 23) | def __init__(self, *args, **kwargs) -> None: class GroupConcat (line 28) | class GroupConcat(Aggregate): method __init__ (line 38) | def __init__(self, *args, **kwargs) -> None: class FTS5Match (line 44) | class FTS5Match(Lookup): method as_sql (line 50) | def as_sql(self, compiler, connection) -> tuple: class Like (line 64) | class Like(Lookup): method as_sql (line 71) | def as_sql(self, compiler, connection) -> tuple: class ComicFTSRank (line 80) | class ComicFTSRank(Func): method __init__ (line 86) | def __init__(self, *args, **kwargs) -> None: FILE: codex/models/groups.py class BrowserGroupModel (line 24) | class BrowserGroupModel(BaseModel): method set_sort_name (line 43) | def set_sort_name(self) -> None: method presave (line 48) | def presave(self) -> None: method save (line 53) | def save(self, *args, **kwargs) -> None: class Meta (line 58) | class Meta(BaseModel.Meta): method _repr_parts (line 63) | def _repr_parts(self) -> tuple[str, ...]: method __repr__ (line 67) | def __repr__(self) -> str: class IdentifiedBrowserGroupModel (line 72) | class IdentifiedBrowserGroupModel(BrowserGroupModel): class Meta (line 85) | class Meta(BrowserGroupModel.Meta): class Publisher (line 91) | class Publisher(IdentifiedBrowserGroupModel): class Meta (line 94) | class Meta(IdentifiedBrowserGroupModel.Meta): class Imprint (line 100) | class Imprint(IdentifiedBrowserGroupModel): class Meta (line 107) | class Meta(IdentifiedBrowserGroupModel.Meta): method _repr_parts (line 113) | def _repr_parts(self) -> tuple: class Series (line 117) | class Series(IdentifiedBrowserGroupModel): class Meta (line 126) | class Meta(IdentifiedBrowserGroupModel.Meta): method _repr_parts (line 133) | def _repr_parts(self) -> tuple: class Volume (line 141) | class Volume(BrowserGroupModel): method set_sort_name (line 164) | def set_sort_name(self): class Meta (line 167) | class Meta(BrowserGroupModel.Meta): method to_str (line 173) | def to_str(cls, number: int | None, number_to: int | None) -> str: method _repr_parts (line 189) | def _repr_parts(self) -> tuple: class WatchedPathBrowserGroup (line 199) | class WatchedPathBrowserGroup(BrowserGroupModel, WatchedPath): method presave (line 203) | def presave(self) -> None: class Meta (line 208) | class Meta(BrowserGroupModel.Meta, WatchedPath.Meta): class Folder (line 214) | class Folder(WatchedPathBrowserGroup): FILE: codex/models/identifier.py class IdentifierSource (line 21) | class IdentifierSource(NamedModel): class IdentifierType (line 25) | class IdentifierType(TextChoices): class Identifier (line 49) | class Identifier(BaseModel): class Meta (line 65) | class Meta(BaseModel.Meta): method name (line 71) | def name(self) -> str: method __repr__ (line 78) | def __repr__(self) -> str: FILE: codex/models/library.py function validate_dir_exists (line 24) | def validate_dir_exists(path) -> None: class Library (line 30) | class Library(BaseModel): method __repr__ (line 57) | def __repr__(self) -> str: class Meta (line 61) | class Meta(BaseModel.Meta): method _save_update_in_progress (line 66) | def _save_update_in_progress(self, *, value: bool) -> None: method start_update (line 70) | def start_update(self) -> None: method end_update (line 74) | def end_update(self) -> None: FILE: codex/models/named.py class IdentifiedNamedModel (line 38) | class IdentifiedNamedModel(NamedModel): class Meta (line 49) | class Meta(NamedModel.Meta): method __repr__ (line 55) | def __repr__(self) -> str: class AgeRating (line 61) | class AgeRating(NamedModel): class Character (line 65) | class Character(IdentifiedNamedModel): class CreditPerson (line 69) | class CreditPerson(IdentifiedNamedModel): class CreditRole (line 73) | class CreditRole(IdentifiedNamedModel): class Credit (line 77) | class Credit(BaseModel): class Meta (line 83) | class Meta(BaseModel.Meta): method __repr__ (line 89) | def __repr__(self) -> str: class Country (line 94) | class Country(NamedModel): class Meta (line 97) | class Meta(NamedModel.Meta): class Genre (line 103) | class Genre(IdentifiedNamedModel): class Language (line 107) | class Language(NamedModel): class Location (line 111) | class Location(IdentifiedNamedModel): class OriginalFormat (line 115) | class OriginalFormat(NamedModel): class ScanInfo (line 119) | class ScanInfo(NamedModel): class SeriesGroup (line 123) | class SeriesGroup(NamedModel): class Story (line 127) | class Story(IdentifiedNamedModel): class Meta (line 130) | class Meta(IdentifiedNamedModel.Meta): class StoryArc (line 136) | class StoryArc(IdentifiedNamedModel, BrowserGroupModel): class Meta (line 139) | class Meta(IdentifiedNamedModel.Meta, BrowserGroupModel.Meta): class StoryArcNumber (line 143) | class StoryArcNumber(BaseModel): class Meta (line 149) | class Meta(BaseModel.Meta): method name (line 155) | def name(self): class Tag (line 161) | class Tag(IdentifiedNamedModel): class Tagger (line 165) | class Tagger(NamedModel): class Team (line 169) | class Team(IdentifiedNamedModel): class Universe (line 173) | class Universe(IdentifiedNamedModel): method __repr__ (line 179) | def __repr__(self) -> str: FILE: codex/models/paths.py class WatchedPath (line 17) | class WatchedPath(BaseModel): method set_stat (line 30) | def set_stat(self) -> None: method presave (line 49) | def presave(self) -> None: method __repr__ (line 54) | def __repr__(self) -> str: class Meta (line 58) | class Meta(BaseModel.Meta): method search_path (line 64) | def search_path(self) -> str: class FailedImport (line 69) | class FailedImport(WatchedPath): method set_reason (line 74) | def set_reason(self, exc) -> None: class CustomCover (line 84) | class CustomCover(WatchedPath): class GroupChoices (line 87) | class GroupChoices(TextChoices): method _set_group_and_sort_name (line 117) | def _set_group_and_sort_name(self) -> None: method presave (line 129) | def presave(self) -> None: FILE: codex/models/query.py class GroupBySQLCompiler (line 13) | class GroupBySQLCompiler(SQLCompiler): method __init__ (line 16) | def __init__(self, *args, **kwargs) -> None: method set_force_group_by (line 22) | def set_force_group_by(self, table, fields) -> None: method get_group_by (line 28) | def get_group_by(self, *args, **kwargs) -> list: class GroupByQuery (line 42) | class GroupByQuery(Query): method __init__ (line 45) | def __init__(self, *args, **kwargs) -> None: method get_compiler (line 52) | def get_compiler( method set_force_group_by (line 75) | def set_force_group_by(self, fields, model=None) -> None: class GroupByQuerySet (line 84) | class GroupByQuerySet(QuerySet): method __init__ (line 87) | def __init__(self, model=None, query=None, using=None, hints=None) -> ... method group_by (line 92) | def group_by(self, *fields, model=None) -> Self: method demote_joins (line 98) | def demote_joins(self, tables) -> Self: class GroupByManager (line 106) | class GroupByManager(Manager.from_queryset(GroupByQuerySet)): # ty: ign... FILE: codex/models/settings.py function cascade_if_session_null (line 47) | def cascade_if_session_null( function cascade_if_user_null (line 72) | def cascade_if_user_null( class ClientChoices (line 100) | class ClientChoices(TextChoices): class FitToChoices (line 107) | class FitToChoices(TextChoices): class SettingsBase (line 121) | class SettingsBase(BaseModel): class Meta (line 145) | class Meta(BaseModel.Meta): method __repr__ (line 151) | def __repr__(self) -> str: class SettingsBrowserShow (line 165) | class SettingsBrowserShow(BaseModel): class Meta (line 178) | class Meta(BaseModel.Meta): method __repr__ (line 190) | def __repr__(self) -> str: class SettingsBrowserFilters (line 194) | class SettingsBrowserFilters(BaseModel): class Meta (line 267) | class Meta(BaseModel.Meta): method __repr__ (line 273) | def __repr__(self) -> str: class SettingsBrowserLastRoute (line 277) | class SettingsBrowserLastRoute(BaseModel): class Meta (line 298) | class Meta(BaseModel.Meta): method __repr__ (line 304) | def __repr__(self) -> str: class SettingsBrowser (line 316) | class SettingsBrowser(SettingsBase): class Meta (line 364) | class Meta(SettingsBase.Meta): class SettingsReader (line 394) | class SettingsReader(SettingsBase): class Meta (line 452) | class Meta(SettingsBase.Meta): FILE: codex/models/util.py function get_sort_name (line 21) | def get_sort_name(name: str) -> str: FILE: codex/run.py function codex_startup (line 31) | def codex_startup() -> bool: function _database_checkpoint (line 37) | def _database_checkpoint() -> None: function restart (line 44) | def restart() -> None: function codex_shutdown (line 52) | def codex_shutdown() -> None: function _build_server (line 61) | def _build_server() -> Server: function _watch_for_changes (line 79) | async def _watch_for_changes() -> None: function _serve (line 90) | async def _serve(server: Server) -> None: function run (line 101) | def run() -> None: function main (line 111) | def main() -> None: FILE: codex/serializers/admin/flags.py class AdminFlagSerializer (line 7) | class AdminFlagSerializer(BaseModelSerializer): class Meta (line 10) | class Meta(BaseModelSerializer.Meta): FILE: codex/serializers/admin/groups.py class GroupSerializer (line 14) | class GroupSerializer(BaseModelSerializer): class Meta (line 19) | class Meta(BaseModelSerializer.Meta): method update (line 27) | def update(self, instance, validated_data) -> Any: method create (line 37) | def create(self, validated_data) -> Any: FILE: codex/serializers/admin/libraries.py class LibrarySerializer (line 18) | class LibrarySerializer(BaseModelSerializer): class Meta (line 24) | class Meta(BaseModelSerializer.Meta): method validate_path (line 48) | def validate_path(self, path): class FailedImportSerializer (line 66) | class FailedImportSerializer(BaseModelSerializer): class Meta (line 69) | class Meta(BaseModelSerializer.Meta): class AdminFolderListSerializer (line 77) | class AdminFolderListSerializer(Serializer): class AdminFolderSerializer (line 84) | class AdminFolderSerializer(Serializer): method validate_path (line 90) | def validate_path(self, path): method validate_show_hidden (line 98) | def validate_show_hidden(self, show_hidden) -> bool: FILE: codex/serializers/admin/stats.py class StatsSystemSerializer (line 19) | class StatsSystemSerializer(Serializer): class StatsPlatformSerializer (line 26) | class StatsPlatformSerializer(Serializer): class StatsConfigSerializer (line 37) | class StatsConfigSerializer(Serializer): class StatsSessionsSerializer (line 48) | class StatsSessionsSerializer(Serializer): class StatsGroupSerializer (line 59) | class StatsGroupSerializer(Serializer): class StatsComicMetadataSerializer (line 71) | class StatsComicMetadataSerializer(Serializer): class StatsSerializer (line 96) | class StatsSerializer(Serializer): class AdminStatsRequestSerializer (line 107) | class AdminStatsRequestSerializer(Serializer): class APIKeySerializer (line 124) | class APIKeySerializer(Serializer): FILE: codex/serializers/admin/tasks.py class AdminLibrarianTaskSerializer (line 24) | class AdminLibrarianTaskSerializer(Serializer): FILE: codex/serializers/admin/users.py class PasswordSerializerMixin (line 14) | class PasswordSerializerMixin(metaclass=SerializerMetaclass): class UserChangePasswordSerializer (line 20) | class UserChangePasswordSerializer(Serializer, PasswordSerializerMixin): class UserSerializer (line 24) | class UserSerializer(BaseModelSerializer, PasswordSerializerMixin): class Meta (line 32) | class Meta(BaseModelSerializer.Meta): FILE: codex/serializers/auth.py class UserSerializer (line 18) | class UserSerializer(BaseModelSerializer): method get_admin_flags (line 28) | def get_admin_flags(self, *_args) -> dict: class Meta (line 40) | class Meta(BaseModelSerializer.Meta): class TimezoneSerializerMixin (line 53) | class TimezoneSerializerMixin(metaclass=SerializerMetaclass): class TimezoneSerializer (line 59) | class TimezoneSerializer(TimezoneSerializerMixin, Serializer): class UserCreateSerializer (line 63) | class UserCreateSerializer(BaseModelSerializer, TimezoneSerializerMixin): class Meta (line 66) | class Meta(BaseModelSerializer.Meta): class UserLoginSerializer (line 74) | class UserLoginSerializer(UserCreateSerializer): class Meta (line 80) | class Meta(UserCreateSerializer.Meta): class AuthAdminFlagsSerializer (line 84) | class AuthAdminFlagsSerializer(Serializer): FILE: codex/serializers/browser/choices.py class BrowserFilterChoicesSerializer (line 28) | class BrowserFilterChoicesSerializer(Serializer): class BrowserSettingsFilterSerializer (line 55) | class BrowserSettingsFilterSerializer(Serializer): class BrowserChoicesIntegerPkSerializer (line 88) | class BrowserChoicesIntegerPkSerializer(Serializer): class BrowserChoicesUniversePkSerializer (line 95) | class BrowserChoicesUniversePkSerializer(Serializer): class BrowserChoicesCharPkSerializer (line 101) | class BrowserChoicesCharPkSerializer(BrowserChoicesIntegerPkSerializer): class BrowserChoicesDecimalPkSerializer (line 107) | class BrowserChoicesDecimalPkSerializer(BrowserChoicesIntegerPkSerializer): class BrowserChoicesFilterSerializer (line 126) | class BrowserChoicesFilterSerializer(Serializer): method get_choices (line 131) | def get_choices(self, obj) -> list: FILE: codex/serializers/browser/filters.py class BrowserSettingsFilterInputSerializer (line 18) | class BrowserSettingsFilterInputSerializer(Serializer): FILE: codex/serializers/browser/metadata.py class GroupSerializer (line 17) | class GroupSerializer(Serializer): class MetadataSerializer (line 26) | class MetadataSerializer(BrowserAggregateSerializerMixin, ComicSerializer): class Meta (line 55) | class Meta(ComicSerializer.Meta): FILE: codex/serializers/browser/mixins.py class BrowserAggregateSerializerMixin (line 21) | class BrowserAggregateSerializerMixin(metaclass=SerializerMetaclass): method _get_max_updated_at (line 39) | def _get_max_updated_at(mtime, updated_ats) -> datetime: method get_mtime (line 56) | def get_mtime(self, obj) -> int: FILE: codex/serializers/browser/mtime.py class GroupsMtimeSerializer (line 10) | class GroupsMtimeSerializer(BrowserFilterChoicesInputSerializer): class MtimeSerializer (line 20) | class MtimeSerializer(Serializer): FILE: codex/serializers/browser/page.py class BrowserCardSerializer (line 19) | class BrowserCardSerializer(BrowserAggregateSerializerMixin, Serializer): class BrowserAdminFlagsSerializer (line 43) | class BrowserAdminFlagsSerializer(Serializer): class BrowserTitleSerializer (line 50) | class BrowserTitleSerializer(Serializer): class BrowserPageSerializer (line 58) | class BrowserPageSerializer(Serializer): FILE: codex/serializers/browser/saved.py class SavedSettingNameSerializer (line 9) | class SavedSettingNameSerializer(Serializer): class SavedBrowserSettingsListSerializer (line 16) | class SavedBrowserSettingsListSerializer(Serializer): class SavedBrowserSettingsSaveSerializer (line 26) | class SavedBrowserSettingsSaveSerializer(Serializer): class SavedSettingsLoadSerializer (line 34) | class SavedSettingsLoadSerializer(Serializer): FILE: codex/serializers/browser/settings.py class BrowserSettingsShowGroupFlagsSerializer (line 22) | class BrowserSettingsShowGroupFlagsSerializer(Serializer): class BrowserSettingsLastRouteSerializer (line 31) | class BrowserSettingsLastRouteSerializer(Serializer): method to_representation (line 39) | def to_representation(self, instance) -> dict: class BrowserFilterChoicesInputSerializer (line 52) | class BrowserFilterChoicesInputSerializer(JSONFieldSerializer): class BrowserCoverInputSerializerBase (line 62) | class BrowserCoverInputSerializerBase(BrowserFilterChoicesInputSerializer): class BrowserCoverInputSerializer (line 76) | class BrowserCoverInputSerializer(BrowserCoverInputSerializerBase): class BrowserSettingsSerializerBase (line 86) | class BrowserSettingsSerializerBase(BrowserCoverInputSerializerBase): method to_internal_value (line 92) | def to_internal_value(self, data) -> dict: class OPDSSettingsSerializer (line 100) | class OPDSSettingsSerializer(BrowserSettingsSerializerBase): class BrowserSettingsSerializer (line 108) | class BrowserSettingsSerializer(BrowserSettingsSerializerBase): class BrowserSettingsInputSerializer (line 120) | class BrowserSettingsInputSerializer(SettingsInputSerializer): FILE: codex/serializers/fields/auth.py class TimestampField (line 14) | class TimestampField(IntegerField): method to_representation (line 18) | def to_representation(self, value) -> int: method to_internal_value (line 25) | def to_internal_value(self, data) -> datetime: # pyright: ignore[repo... function validate_timezone (line 30) | def validate_timezone(data): class TimezoneField (line 39) | class TimezoneField(CharField): method __init__ (line 42) | def __init__(self, *args, **kwargs) -> None: FILE: codex/serializers/fields/base.py class CodexChoiceField (line 9) | class CodexChoiceField(ChoiceField, ABC): method __init__ (line 14) | def __init__(self, **kwargs) -> None: FILE: codex/serializers/fields/browser.py class BookmarkFilterField (line 20) | class BookmarkFilterField(CodexChoiceField): class PyCountryField (line 26) | class PyCountryField(SanitizedCharField, ABC): method to_representation (line 33) | def to_representation(self, value) -> str: class CountryField (line 54) | class CountryField(PyCountryField): class LanguageField (line 60) | class LanguageField(PyCountryField): class BreadcrumbsField (line 66) | class BreadcrumbsField(ListField): FILE: codex/serializers/fields/group.py class BrowseGroupField (line 7) | class BrowseGroupField(CodexChoiceField): class BrowserRouteGroupField (line 13) | class BrowserRouteGroupField(CodexChoiceField): FILE: codex/serializers/fields/reader.py class FitToField (line 11) | class FitToField(CodexChoiceField): class ReadingDirectionField (line 17) | class ReadingDirectionField(CodexChoiceField): class ArcGroupField (line 23) | class ArcGroupField(CodexChoiceField): FILE: codex/serializers/fields/sanitized.py class SanitizedCharField (line 9) | class SanitizedCharField(CharField): method to_internal_value (line 13) | def to_internal_value(self, data) -> str: FILE: codex/serializers/fields/settings.py class SettingsKeyField (line 8) | class SettingsKeyField(CodexChoiceField): FILE: codex/serializers/fields/stats.py class StringListMultipleChoiceField (line 9) | class StringListMultipleChoiceField(MultipleChoiceField): method to_internal_value (line 13) | def to_internal_value(self, data) -> str: class SerializerChoicesField (line 20) | class SerializerChoicesField(StringListMultipleChoiceField): method __init__ (line 23) | def __init__(self, serializer=None, **kwargs) -> None: class CountDictField (line 32) | class CountDictField(DictField): FILE: codex/serializers/fields/vuetify.py class VuetifyNullCodeFieldMixin (line 21) | class VuetifyNullCodeFieldMixin: method to_internal_value (line 26) | def to_internal_value(self, data): method to_representation (line 31) | def to_representation(self, data): class VuetifyFileTypeChoiceField (line 37) | class VuetifyFileTypeChoiceField(VuetifyNullCodeFieldMixin, CodexChoiceF... class VuetifyReadingDirectionChoiceField (line 43) | class VuetifyReadingDirectionChoiceField(VuetifyNullCodeFieldMixin, Code... class VuetifyDecimalField (line 49) | class VuetifyDecimalField(VuetifyNullCodeFieldMixin, DecimalField): # p... class VuetifyIntegerField (line 53) | class VuetifyIntegerField(VuetifyNullCodeFieldMixin, IntegerField): # p... class VuetifyCharField (line 57) | class VuetifyCharField(VuetifyNullCodeFieldMixin, CharField): # pyright... class VuetifyBooleanField (line 63) | class VuetifyBooleanField(VuetifyNullCodeFieldMixin, BooleanField): # p... function validate_decade (line 67) | def validate_decade(decade) -> bool: class VuetifyDecadeField (line 76) | class VuetifyDecadeField(VuetifyIntegerField): method __init__ (line 81) | def __init__(self, *args, **kwargs) -> None: class VuetifyListField (line 86) | class VuetifyListField(ListField): method __init__ (line 92) | def __init__( method to_representation (line 109) | def to_representation(self, value: list) -> list: class VuetifyReadOnlyListField (line 118) | class VuetifyReadOnlyListField(VuetifyListField): FILE: codex/serializers/homepage.py class HomepageSerializer (line 6) | class HomepageSerializer(Serializer): FILE: codex/serializers/mixins.py class OKSerializer (line 18) | class OKSerializer(Serializer): class JSONFieldSerializer (line 24) | class JSONFieldSerializer(Serializer): method _parse_json_field (line 30) | def _parse_json_field(key, value) -> str | None: method to_internal_value (line 42) | def to_internal_value(self, data) -> dict: FILE: codex/serializers/models/admin.py class LibrarianStatusSerializer (line 7) | class LibrarianStatusSerializer(BaseModelSerializer): class Meta (line 10) | class Meta(BaseModelSerializer.Meta): FILE: codex/serializers/models/base.py class BaseModelSerializer (line 6) | class BaseModelSerializer(ModelSerializer): class Meta (line 9) | class Meta(SerializerMetaclass): # pyright: ignore[reportIncompatible... FILE: codex/serializers/models/bookmark.py class BookmarkSerializer (line 7) | class BookmarkSerializer(BaseModelSerializer): class Meta (line 10) | class Meta(BaseModelSerializer.Meta): class BookmarkFinishedSerializer (line 20) | class BookmarkFinishedSerializer(BaseModelSerializer): class Meta (line 23) | class Meta(BaseModelSerializer.Meta): FILE: codex/serializers/models/comic.py class ComicSerializer (line 35) | class ComicSerializer(BaseModelSerializer): class Meta (line 79) | class Meta(BaseModelSerializer.Meta): FILE: codex/serializers/models/groups.py class GroupModelSerializer (line 12) | class GroupModelSerializer(NamedModelSerializer): class Meta (line 15) | class Meta(NamedModelSerializer.Meta): class PublisherSerializer (line 21) | class PublisherSerializer(GroupModelSerializer): class Meta (line 24) | class Meta(GroupModelSerializer.Meta): class ImprintSerializer (line 30) | class ImprintSerializer(GroupModelSerializer): class Meta (line 33) | class Meta(GroupModelSerializer.Meta): class SeriesSerializer (line 39) | class SeriesSerializer(GroupModelSerializer): class Meta (line 42) | class Meta(GroupModelSerializer.Meta): class VolumeSerializer (line 48) | class VolumeSerializer(GroupModelSerializer): class Meta (line 51) | class Meta(GroupModelSerializer.Meta): FILE: codex/serializers/models/named.py class NamedModelSerializer (line 29) | class NamedModelSerializer(BaseModelSerializer): class Meta (line 32) | class Meta(BaseModelSerializer.Meta): class URLNamedModelSerializer (line 39) | class URLNamedModelSerializer(NamedModelSerializer): class Meta (line 44) | class Meta(NamedModelSerializer.Meta): class CreditPersonSerializer (line 51) | class CreditPersonSerializer(URLNamedModelSerializer): class Meta (line 54) | class Meta(URLNamedModelSerializer.Meta): class CreditRoleSerializer (line 60) | class CreditRoleSerializer(URLNamedModelSerializer): class Meta (line 63) | class Meta(URLNamedModelSerializer.Meta): class CreditSerializer (line 69) | class CreditSerializer(BaseModelSerializer): class Meta (line 75) | class Meta(BaseModelSerializer.Meta): class CharacterSerializer (line 83) | class CharacterSerializer(URLNamedModelSerializer): class Meta (line 86) | class Meta(URLNamedModelSerializer.Meta): class GenreSerializer (line 92) | class GenreSerializer(URLNamedModelSerializer): class Meta (line 95) | class Meta(URLNamedModelSerializer.Meta): class IdentifierSourceSerializer (line 101) | class IdentifierSourceSerializer(NamedModelSerializer): class Meta (line 104) | class Meta(NamedModelSerializer.Meta): class IdentifierSeralizer (line 110) | class IdentifierSeralizer(BaseModelSerializer): class Meta (line 115) | class Meta(BaseModelSerializer.Meta): class LocationSerializer (line 123) | class LocationSerializer(URLNamedModelSerializer): class Meta (line 126) | class Meta(URLNamedModelSerializer.Meta): class SeriesGroupSerializer (line 132) | class SeriesGroupSerializer(NamedModelSerializer): class Meta (line 135) | class Meta(NamedModelSerializer.Meta): class StorySerializer (line 141) | class StorySerializer(URLNamedModelSerializer): class Meta (line 144) | class Meta(URLNamedModelSerializer.Meta): class StoryArcSerializer (line 150) | class StoryArcSerializer(URLNamedModelSerializer): class Meta (line 153) | class Meta(URLNamedModelSerializer.Meta): class StoryArcNumberSerializer (line 159) | class StoryArcNumberSerializer(BaseModelSerializer): class Meta (line 165) | class Meta(BaseModelSerializer.Meta): class TaggerSerializer (line 173) | class TaggerSerializer(NamedModelSerializer): class Meta (line 176) | class Meta(NamedModelSerializer.Meta): class AgeRatingSerializer (line 182) | class AgeRatingSerializer(NamedModelSerializer): class Meta (line 185) | class Meta(NamedModelSerializer.Meta): class TagSerializer (line 191) | class TagSerializer(URLNamedModelSerializer): class Meta (line 194) | class Meta(URLNamedModelSerializer.Meta): class OriginalFormatSerializer (line 200) | class OriginalFormatSerializer(NamedModelSerializer): class Meta (line 203) | class Meta(NamedModelSerializer.Meta): class ScanInfoSerializer (line 209) | class ScanInfoSerializer(NamedModelSerializer): class Meta (line 212) | class Meta(NamedModelSerializer.Meta): class TeamSerializer (line 218) | class TeamSerializer(URLNamedModelSerializer): class Meta (line 221) | class Meta(URLNamedModelSerializer.Meta): class UniverseSerializer (line 227) | class UniverseSerializer(URLNamedModelSerializer): class Meta (line 230) | class Meta(URLNamedModelSerializer.Meta): FILE: codex/serializers/models/pycountry.py class CountrySerializer (line 11) | class CountrySerializer(NamedModelSerializer): class Meta (line 16) | class Meta(NamedModelSerializer.Meta): class LanguageSerializer (line 22) | class LanguageSerializer(NamedModelSerializer): class Meta (line 27) | class Meta(NamedModelSerializer.Meta): FILE: codex/serializers/opds/authentication.py class OPDSAuth1LinksSerializer (line 11) | class OPDSAuth1LinksSerializer(Serializer): class OPDSAuthetication1LabelsSerializer (line 21) | class OPDSAuthetication1LabelsSerializer(Serializer): class OPDSAuthentication1FlowSerializer (line 28) | class OPDSAuthentication1FlowSerializer(Serializer): class OPDSAuthentication1Serializer (line 36) | class OPDSAuthentication1Serializer(Serializer): FILE: codex/serializers/opds/urls.py class OPDSURLsSerializer (line 7) | class OPDSURLsSerializer(Serializer): FILE: codex/serializers/opds/v1.py class OPDS1TemplateLinkSerializer (line 21) | class OPDS1TemplateLinkSerializer(Serializer): class OPDS1CreditSerializer (line 37) | class OPDS1CreditSerializer(Serializer): class OPDS1TemplateEntrySerializer (line 44) | class OPDS1TemplateEntrySerializer(Serializer): class OPDS1TemplateSerializer (line 61) | class OPDS1TemplateSerializer(Serializer): FILE: codex/serializers/opds/v2/facet.py class OPDS2FacetSerializer (line 9) | class OPDS2FacetSerializer(Serializer): FILE: codex/serializers/opds/v2/feed.py class OPDS2GroupSerializer (line 14) | class OPDS2GroupSerializer(Serializer): class OPDS2FeedSerializer (line 29) | class OPDS2FeedSerializer(OPDS2GroupSerializer): FILE: codex/serializers/opds/v2/links.py class OPDS2LinkBaseSerializer (line 15) | class OPDS2LinkBaseSerializer(Serializer): method get_rel (line 22) | def get_rel(self, obj) -> str | list[str]: method to_representation (line 31) | def to_representation(self, instance) -> dict: class OPSD2AuthenticateSerializer (line 41) | class OPSD2AuthenticateSerializer(OPDS2LinkBaseSerializer): class OPDS2LinkPropertiesSerializer (line 49) | class OPDS2LinkPropertiesSerializer(Serializer): class OPDS2LinkSerializer (line 72) | class OPDS2LinkSerializer(OPDS2LinkBaseSerializer): class OPDS2LinkListField (line 100) | class OPDS2LinkListField(ListField): FILE: codex/serializers/opds/v2/metadata.py class OPDS2MetadataSerializer (line 7) | class OPDS2MetadataSerializer(Serializer): FILE: codex/serializers/opds/v2/progression.py class OPDS2ProgressionDeviceSerializer (line 17) | class OPDS2ProgressionDeviceSerializer(Serializer): class OPDS2ProgressionLocationsSerializer (line 24) | class OPDS2ProgressionLocationsSerializer(Serializer): class OPDS2ProgressionLocatorSerializer (line 33) | class OPDS2ProgressionLocatorSerializer(Serializer): class OPDS2ProgressionSerializer (line 42) | class OPDS2ProgressionSerializer(Serializer): FILE: codex/serializers/opds/v2/publication.py class OPDS2SubjectSerializer (line 11) | class OPDS2SubjectSerializer(Serializer): class OPDS2ContributorSerializer (line 25) | class OPDS2ContributorSerializer(OPDS2SubjectSerializer): class OPDS2BelongsToObjectSerializer (line 38) | class OPDS2BelongsToObjectSerializer(Serializer): class OPDS2BelongsTo (line 46) | class OPDS2BelongsTo(Serializer): class OPDS2PublicationMetadataSerializer (line 66) | class OPDS2PublicationMetadataSerializer(OPDS2MetadataSerializer): class OPDS2PublicationSerializer (line 111) | class OPDS2PublicationSerializer(OPDS2FacetSerializer): class OPDS2PublicationDivinaMetadataSerializer (line 126) | class OPDS2PublicationDivinaMetadataSerializer(OPDS2PublicationMetadataS... class OPDS2PublicationDivinaManifestSerializer (line 138) | class OPDS2PublicationDivinaManifestSerializer(OPDS2PublicationSerializer): FILE: codex/serializers/opds/v2/unused.py class RecursiveField (line 11) | class RecursiveField(Serializer): method to_representation (line 20) | def to_representation(self, instance) -> Any: class OPDS2PriceSerializer (line 28) | class OPDS2PriceSerializer(Serializer): class OPDS2HoldsSerializer (line 40) | class OPDS2HoldsSerializer(Serializer): class OPDS2CopiesSerializer (line 51) | class OPDS2CopiesSerializer(Serializer): class OPDS2AcquisitionObjectSerializer (line 62) | class OPDS2AcquisitionObjectSerializer(Serializer): class OPDS2ProfileSerializer (line 73) | class OPDS2ProfileSerializer(Serializer): class OPDS2AvailabilitySerializer (line 87) | class OPDS2AvailabilitySerializer(Serializer): FILE: codex/serializers/reader.py class ReaderSettingsSerializer (line 25) | class ReaderSettingsSerializer(Serializer): class ReaderScopedUpdateSerializer (line 40) | class ReaderScopedUpdateSerializer(ReaderSettingsSerializer): class ReaderBookmarkSerializer (line 47) | class ReaderBookmarkSerializer(Serializer): class ReaderComicSerializer (line 54) | class ReaderComicSerializer(Serializer): class ReaderArcInfoSerializer (line 66) | class ReaderArcInfoSerializer(Serializer): class ReaderSelectedArcSerializer (line 73) | class ReaderSelectedArcSerializer(Serializer): class ReaderViewInputSerializer (line 82) | class ReaderViewInputSerializer(JSONFieldSerializer): class ReaderCurrentComicSerializer (line 90) | class ReaderCurrentComicSerializer(ReaderComicSerializer): class ReaderBooksSerializer (line 111) | class ReaderBooksSerializer(Serializer): class ArcsIdsField (line 119) | class ArcsIdsField(DictField): method to_representation (line 123) | def to_representation(self, value): class ArcsField (line 135) | class ArcsField(DictField): class ReaderComicsSerializer (line 141) | class ReaderComicsSerializer(Serializer): FILE: codex/serializers/redirect.py class ReaderRedirectSerializer (line 10) | class ReaderRedirectSerializer(Serializer): class BrowserRedirectSerializer (line 17) | class BrowserRedirectSerializer(ReaderRedirectSerializer): FILE: codex/serializers/route.py class SimpleRouteSerializer (line 14) | class SimpleRouteSerializer(Serializer): method to_representation (line 21) | def to_representation(self, instance) -> dict: method to_internal_value (line 32) | def to_internal_value(self, data) -> dict: class RouteSerializer (line 47) | class RouteSerializer(SimpleRouteSerializer): FILE: codex/serializers/settings.py class SettingsInputSerializer (line 9) | class SettingsInputSerializer(JSONFieldSerializer): FILE: codex/serializers/versions.py class VersionsSerializer (line 7) | class VersionsSerializer(Serializer): FILE: codex/settings/__init__.py function not_falsy_env (line 43) | def not_falsy_env(name): function _get_installed_apps (line 245) | def _get_installed_apps() -> tuple: function _get_middleware (line 284) | def _get_middleware() -> tuple: function create_custom_cover_group_dirs (line 607) | def create_custom_cover_group_dirs() -> None: FILE: codex/settings/config.py function _deep_get (line 64) | def _deep_get(data: Mapping, keypath: str, default=None): function _deep_set (line 77) | def _deep_set(data: MutableMapping, keypath: str, value) -> None: function _ensure_config (line 85) | def _ensure_config(config_toml: Path, config_toml_default: Path) -> None: function _apply_env_overrides (line 95) | def _apply_env_overrides(config: MutableMapping) -> None: function load_codex_config (line 103) | def load_codex_config(config_toml: Path, config_toml_default: Path) -> M... function get_str (line 115) | def get_str(config: Mapping, keypath: str, default: str = "") -> str: function get_int (line 121) | def get_int(config: Mapping, keypath: str, default: int = 0) -> int: function get_float (line 127) | def get_float(config: Mapping, keypath: str, default: float = 0.0) -> fl... function get_bool (line 133) | def get_bool(config: Mapping, keypath: str, *, default: bool = False) ->... FILE: codex/settings/hypercorn_migrate.py function _parse_bind (line 20) | def _parse_bind(bind_list: list[str]) -> tuple[str, int]: function _toml_value (line 38) | def _toml_value(val: object) -> str: function _transform_hypercorn_config (line 54) | def _transform_hypercorn_config(old: dict): function _build_codex_toml_line (line 73) | def _build_codex_toml_line(lines: list[str], key: str, value, default): function _append_granian_ssl_comment (line 81) | def _append_granian_ssl_comment(lines: list[str], old: dict[str, Any]): function _build_codex_toml (line 97) | def _build_codex_toml(old: dict, default_toml: Path) -> str: function migrate_hypercorn_config (line 158) | def migrate_hypercorn_config(codex_toml: Path, default_toml: Path) -> None: FILE: codex/settings/logging.py class LoguruHandler (line 9) | class LoguruHandler(Handler): method emit (line 13) | def emit(self, record): function get_logging_settings (line 26) | def get_logging_settings(loglevel: str | int, *, debug: bool) -> dict[st... FILE: codex/settings/secret_key.py function get_secret_key (line 6) | def get_secret_key(config_path) -> str: FILE: codex/settings/servestatic.py function immutable_file_test (line 8) | def immutable_file_test(_path, url): FILE: codex/settings/timezone.py function get_time_zone (line 6) | def get_time_zone(tz): FILE: codex/signals/django_signals.py function connect_signals (line 5) | def connect_signals() -> None: FILE: codex/signals/os_signals.py function _shutdown_signal_handler (line 26) | def _shutdown_signal_handler(*_args) -> None: function _restart_signal_handler (line 34) | def _restart_signal_handler(*_args) -> None: function bind_signals_to_loop_aux (line 43) | def bind_signals_to_loop_aux(sig_add, signal_names, handler) -> None: function bind_signals_to_loop (line 50) | def bind_signals_to_loop() -> None: FILE: codex/startup/__init__.py function ensure_superuser (line 28) | def ensure_superuser() -> None: function _delete_orphans (line 41) | def _delete_orphans(model, field, names) -> None: function init_admin_flags (line 50) | def init_admin_flags() -> None: function init_timestamps (line 61) | def init_timestamps() -> None: function init_librarian_statuses (line 75) | def init_librarian_statuses() -> None: function init_libraries (line 108) | def init_libraries() -> None: function init_custom_cover_dir (line 117) | def init_custom_cover_dir() -> None: function update_custom_covers_for_config_dir (line 134) | def update_custom_covers_for_config_dir() -> None: function create_missing_auth_tokens (line 183) | def create_missing_auth_tokens() -> None: function ensure_db_rows (line 193) | def ensure_db_rows() -> None: function codex_init (line 205) | def codex_init() -> bool: FILE: codex/startup/custom_cover_libraries.py function _repair_extra_custom_cover_libraries (line 10) | def _repair_extra_custom_cover_libraries(library_model, log) -> None: function cleanup_custom_cover_libraries (line 22) | def cleanup_custom_cover_libraries(log) -> None: FILE: codex/startup/db.py function _has_unapplied_migrations (line 37) | def _has_unapplied_migrations() -> bool: function _get_backup_db_path (line 54) | def _get_backup_db_path(prefix): function _backup_db_before_migration (line 59) | def _backup_db_before_migration() -> None: function _repair_db (line 67) | def _repair_db(log) -> None: function _rebuild_db (line 80) | def _rebuild_db() -> bool: function ensure_db_schema (line 112) | def ensure_db_schema() -> bool: FILE: codex/startup/loguru.py function _log_format (line 11) | def _log_format() -> str: function loguru_init (line 23) | def loguru_init() -> None: FILE: codex/startup/registration.py function patch_registration_setting (line 9) | def patch_registration_setting() -> None: FILE: codex/templates/pwa/serviceworker.js constant CACHE_PREFIX (line 2) | const CACHE_PREFIX = "codex-pwa-v"; constant STATIC_CACHE_NAME (line 3) | const STATIC_CACHE_NAME = CACHE_PREFIX + new Date().getSeconds(); constant OFFLINE_PATH (line 4) | const OFFLINE_PATH = "{% static 'pwa/offline.html' %}"; constant FILES_TO_CACHE (line 5) | const FILES_TO_CACHE = [ FILE: codex/urls/converters.py class GroupConverter (line 7) | class GroupConverter(StringConverter): class IntListConverter (line 13) | class IntListConverter: method to_python (line 19) | def to_python(self, value) -> tuple: method to_url (line 36) | def to_url(self, value) -> str: FILE: codex/urls/spectacular.py function allow_list (line 6) | def allow_list(endpoints) -> list: FILE: codex/util.py function max_none (line 6) | def max_none(*args): function mapping_to_dict (line 11) | def mapping_to_dict(data) -> dict | set | frozenset | tuple | list: function flatten (line 20) | def flatten(seq: tuple | list | frozenset | set): FILE: codex/version.py function get_version (line 8) | def get_version() -> str: FILE: codex/views/admin/api_key.py class AdminAPIKey (line 11) | class AdminAPIKey(AdminGenericAPIView): method put (line 18) | def put(self, *_args, **_kwargs) -> Response: FILE: codex/views/admin/auth.py class AdminAuthMixin (line 9) | class AdminAuthMixin: class AdminAPIView (line 15) | class AdminAPIView(AdminAuthMixin, APIView): class AdminGenericAPIView (line 19) | class AdminGenericAPIView(AdminAuthMixin, GenericAPIView): class AdminModelViewSet (line 23) | class AdminModelViewSet(AdminAuthMixin, ModelViewSet): class AdminReadOnlyModelViewSet (line 27) | class AdminReadOnlyModelViewSet(AdminAuthMixin, ReadOnlyModelViewSet): FILE: codex/views/admin/flag.py class AdminFlagViewSet (line 24) | class AdminFlagViewSet(AdminModelViewSet): method _on_change (line 31) | def _on_change(self) -> None: method perform_update (line 45) | def perform_update(self, serializer) -> None: FILE: codex/views/admin/group.py class AdminGroupViewSet (line 14) | class AdminGroupViewSet(AdminModelViewSet): method _on_change (line 24) | def _on_change(self, validated_data=None) -> None: method get_serializer (line 33) | def get_serializer(self, *args, **kwargs): method perform_update (line 39) | def perform_update(self, serializer) -> None: method perform_create (line 46) | def perform_create(self, serializer) -> None: method perform_destroy (line 53) | def perform_destroy(self, instance) -> None: FILE: codex/views/admin/library.py class AdminLibraryViewSet (line 41) | class AdminLibraryViewSet(AdminModelViewSet): method _sync_watcher (line 63) | def _sync_watcher(cls, validated_keys=None) -> None: method _on_change (line 71) | def _on_change() -> None: method _create_library_folder (line 76) | def _create_library_folder(self, library) -> None: method _poll (line 83) | def _poll(pk, force) -> None: method perform_create (line 88) | def perform_create(self, serializer) -> None: method perform_update (line 101) | def perform_update(self, serializer) -> None: method perform_destroy (line 115) | def perform_destroy(self, instance) -> None: class AdminFailedImportViewSet (line 124) | class AdminFailedImportViewSet(AdminModelViewSet): class AdminFolderListView (line 131) | class AdminFolderListView(AdminGenericAPIView): method _get_dirs (line 138) | def _get_dirs(root_path, show_hidden) -> tuple: method get (line 153) | def get(self, *_args, **_kwargs) -> Response: FILE: codex/views/admin/permissions.py class HasAPIKeyOrIsAdminUser (line 10) | class HasAPIKeyOrIsAdminUser(BasePermission): method has_permission (line 14) | def has_permission(self, request, view) -> bool: FILE: codex/views/admin/stats.py class AdminStatsView (line 21) | class AdminStatsView(AdminGenericAPIView): method __init__ (line 28) | def __init__(self, *args, **kwargs) -> None: method params (line 34) | def params(self) -> MappingProxyType[str, Any]: method _add_api_key (line 51) | def _add_api_key(self, obj) -> None: method get_object (line 62) | def get_object(self) -> dict: method get (line 70) | def get(self, *_args, **_kwargs) -> Response: FILE: codex/views/admin/tasks.py class AdminLibrarianStatusActiveViewSet (line 120) | class AdminLibrarianStatusActiveViewSet(AdminReadOnlyModelViewSet): class AdminLibrarianStatusAllViewSet (line 129) | class AdminLibrarianStatusAllViewSet(AdminReadOnlyModelViewSet): class AdminLibrarianTaskView (line 136) | class AdminLibrarianTaskView(AdminAPIView): method _get_task (line 142) | def _get_task(self, name, pk) -> LibrarianTask | None: method post (line 155) | def post(self, *_args, **_kwargs) -> Response: FILE: codex/views/admin/user.py class AdminUserViewSet (line 25) | class AdminUserViewSet(AdminModelViewSet): method _on_change (line 37) | def _on_change(uid: int) -> None: method get_serializer (line 50) | def get_serializer(self, *args, **kwargs): method _is_change_to_current_user (line 56) | def _is_change_to_current_user(self) -> bool: method destroy (line 61) | def destroy(self, request, *args, **kwargs) -> Response: method perform_update (line 71) | def perform_update(self, serializer) -> None: method perform_create (line 86) | def perform_create(self, serializer) -> None: class AdminUserChangePasswordView (line 100) | class AdminUserChangePasswordView(AdminGenericAPIView): method put (line 105) | def put(self, request, *args, **kwargs) -> Response: FILE: codex/views/auth.py class IsAuthenticatedOrEnabledNonUsers (line 21) | class IsAuthenticatedOrEnabledNonUsers(IsAuthenticated): method has_permission (line 27) | def has_permission(self, request, view) -> bool: class AuthMixin (line 37) | class AuthMixin: class AuthAPIView (line 45) | class AuthAPIView(AuthMixin, APIView): # pyright: ignore[reportIncompat... class AuthGenericAPIView (line 49) | class AuthGenericAPIView(AuthMixin, GenericAPIView): # pyright: ignore[... class GroupACLMixin (line 53) | class GroupACLMixin: method init_group_acl (line 56) | def init_group_acl(self) -> None: method is_admin (line 61) | def is_admin(self) -> bool: method get_rel_prefix (line 69) | def get_rel_prefix(model) -> str: method get_group_acl_filter (line 80) | def get_group_acl_filter(cls, model, user) -> Q: class AuthFilterGenericAPIView (line 112) | class AuthFilterGenericAPIView(AuthGenericAPIView, GroupACLMixin): method __init__ (line 115) | def __init__(self, *args, **kwargs) -> None: class AuthFilterAPIView (line 121) | class AuthFilterAPIView(AuthAPIView, GroupACLMixin): method __init__ (line 124) | def __init__(self, *args, **kwargs) -> None: class AuthToken (line 130) | class AuthToken(AuthGenericAPIView): method get (line 135) | def get(self, *args, **kwargs) -> Response: method put (line 149) | def put(self, *args, **kwargs) -> Response: FILE: codex/views/bookmark.py class BookmarkFilterMixin (line 20) | class BookmarkFilterMixin(GroupACLMixin, ABC): method init_bookmark_filter (line 23) | def init_bookmark_filter(self) -> None: method get_bm_rel (line 30) | def get_bm_rel(self, model): method get_my_bookmark_filter (line 37) | def get_my_bookmark_filter(self, bm_rel) -> Q: class BookmarkAuthMixin (line 49) | class BookmarkAuthMixin: method get_bookmark_auth_filter (line 52) | def get_bookmark_auth_filter(self) -> dict[str, int | str | None]: class BookmarkPageMixin (line 68) | class BookmarkPageMixin(BookmarkAuthMixin): method update_bookmark (line 71) | def update_bookmark(self) -> None: class BookmarkPageView (line 87) | class BookmarkPageView(BookmarkPageMixin, AuthAPIView): method put (line 90) | def put(self, *_args, **_kwargs) -> Response: FILE: codex/views/browser/annotate/bookmark.py class BrowserAnnotateBookmarkView (line 21) | class BrowserAnnotateBookmarkView(BrowserAnnotateOrderView): method _get_group_bookmark_page_annotation (line 24) | def _get_group_bookmark_page_annotation( method _get_group_bookmark_finished_annotation (line 48) | def _get_group_bookmark_finished_annotation( method annotate_bookmarks (line 69) | def annotate_bookmarks(self, qs): method annotate_progress (line 103) | def annotate_progress(self, qs): FILE: codex/views/browser/annotate/card.py class BrowserAnnotateCardView (line 30) | class BrowserAnnotateCardView(BrowserAnnotateBookmarkView): method add_group_by (line 33) | def add_group_by(self, qs): method _annotate_group (line 40) | def _annotate_group(self, qs): method _annotate_file_name (line 45) | def _annotate_file_name(self, qs): method _annotate_has_metadata (line 55) | def _annotate_has_metadata(self, qs): method annotate_card_aggregates (line 61) | def annotate_card_aggregates(self, qs): FILE: codex/views/browser/annotate/order.py class BrowserAnnotateOrderView (line 58) | class BrowserAnnotateOrderView(BrowserOrderByView, SharedAnnotationsMixin): method __init__ (line 66) | def __init__(self, *args, **kwargs) -> None: method opds_acquisition_groups (line 76) | def opds_acquisition_groups(self): method is_opds_acquisition (line 85) | def is_opds_acquisition(self) -> bool: method order_agg_func (line 99) | def order_agg_func(self): method _alias_sort_names (line 106) | def _alias_sort_names(self, qs): method get_filename_func (line 124) | def get_filename_func(self, model) -> Right: method _alias_filename (line 139) | def _alias_filename(self, qs): method _alias_story_arc_number (line 150) | def _alias_story_arc_number(self, qs): method _annotate_page_count (line 176) | def _annotate_page_count(self, qs): method _annotate_bookmark_updated_at (line 193) | def _annotate_bookmark_updated_at(self, qs) -> QuerySet: method _annotate_search_scores (line 205) | def _annotate_search_scores(self, qs): method annotate_child_count (line 217) | def annotate_child_count(self, qs): method _annotate_order_child_count (line 228) | def _annotate_order_child_count(self, qs): method annotate_order_value (line 234) | def annotate_order_value(self, qs): method annotate_order_aggregates (line 261) | def annotate_order_aggregates(self, qs: QuerySet): FILE: codex/views/browser/bookmark.py class BookmarkView (line 20) | class BookmarkView(BookmarkUpdateMixin, BookmarkAuthMixin, BrowserFilter... method __init__ (line 27) | def __init__(self, *args, **kwargs) -> None: method _parse_params (line 32) | def _parse_params(self): method _get_comic_query (line 46) | def _get_comic_query(self): method patch (line 53) | def patch(self, *_args, **_kwargs) -> Response: method params (line 65) | def params(self): FILE: codex/views/browser/breadcrumbs.py class BrowserBreadcrumbsView (line 52) | class BrowserBreadcrumbsView(BrowserPaginateView): method __init__ (line 55) | def __init__(self, *args, **kwargs) -> None: method _get_group_query (line 61) | def _get_group_query(self, model): method _handle_group_query_missing_model (line 70) | def _handle_group_query_missing_model(self, model) -> QuerySet: method group_instance (line 86) | def group_instance(self) -> BrowserGroupModel | None: method _build_group_breadcrumbs (line 104) | def _build_group_breadcrumbs(self) -> tuple[Route, ...]: method _build_folder_breadcrumbs (line 133) | def _build_folder_breadcrumbs(self) -> tuple[Route, ...]: method _build_story_arc_breadcrumbs (line 154) | def _build_story_arc_breadcrumbs(self) -> tuple[Route, ...]: method get_breadcrumbs (line 169) | def get_breadcrumbs(self) -> tuple[Route, ...]: FILE: codex/views/browser/browser.py class BrowserView (line 30) | class BrowserView(BrowserTitleView): method model_group (line 47) | def model_group(self): method _get_limit (line 72) | def _get_limit(self): method _get_common_queryset (line 83) | def _get_common_queryset(self, model) -> tuple: method _get_group_queryset (line 110) | def _get_group_queryset(self) -> tuple: method _get_book_queryset (line 120) | def _get_book_queryset(self) -> tuple: method _get_zero_pad (line 130) | def _get_zero_pad(book_qs) -> int: method _get_page_mtime (line 140) | def _get_page_mtime(self): method _debug_queries (line 143) | def _debug_queries(self, group_count, book_count, group_qs, book_qs) -... method get_book_qs (line 152) | def get_book_qs(self) -> tuple: method _get_group_and_books (line 165) | def _get_group_and_books(self) -> tuple: method get_object (line 195) | def get_object(self) -> MappingProxyType: method get (line 227) | def get(self, *_args, **_kwargs) -> Response: FILE: codex/views/browser/choices.py class BrowserChoicesViewBase (line 60) | class BrowserChoicesViewBase(BrowserFilterView): method get_field_choices_query (line 69) | def get_field_choices_query(comic_qs, field_name): method get_m2m_field_query (line 73) | def get_m2m_field_query(self, model, comic_qs: QuerySet): method does_m2m_null_exist (line 80) | def does_m2m_null_exist(comic_qs, rel): method get_rel_and_model (line 85) | def get_rel_and_model(self, field_name) -> tuple: method get_object (line 100) | def get_object(self) -> QuerySet: method get (line 105) | def get(self, *_args, **_kwargs) -> Response: class BrowserChoicesAvailableView (line 112) | class BrowserChoicesAvailableView(BrowserChoicesViewBase): method _is_field_choices_exists (line 118) | def _is_field_choices_exists(cls, comic_qs, field_name) -> bool: method _is_m2m_field_choices_exists (line 123) | def _is_m2m_field_choices_exists(self, model, comic_qs, rel) -> bool: method _is_filter_field_choices_exists (line 137) | def _is_filter_field_choices_exists(self, qs: QuerySet, field_name: st... method get_object (line 151) | def get_object(self) -> dict[str, Any]: # pyright: ignore[reportIncom... class BrowserChoicesView (line 169) | class BrowserChoicesView(BrowserChoicesViewBase): method _get_m2m_field_choices (line 174) | def _get_m2m_field_choices(self, model, comic_qs, rel): method _get_field_name (line 193) | def _get_field_name(self): method get_object (line 198) | def get_object(self) -> dict[str, Any]: # pyright: ignore[reportIncom... FILE: codex/views/browser/cover.py class WEBPRenderer (line 31) | class WEBPRenderer(BaseRenderer): method render (line 40) | def render(self, data, *_args, **_kwargs) -> Any: class CoverView (line 45) | class CoverView(BrowserAnnotateOrderView): method get_group_filter (line 56) | def get_group_filter(self, group=None, pks=None, *, page_mtime=False) ... method _get_comic_cover (line 78) | def _get_comic_cover(self) -> tuple: method _get_custom_cover (line 82) | def _get_custom_cover(self) -> CustomCover | None: method _get_dynamic_cover (line 94) | def _get_dynamic_cover(self) -> tuple: method _get_cover_pk (line 104) | def _get_cover_pk(self) -> tuple[int, bool]: method _get_missing_cover_path (line 115) | def _get_missing_cover_path(self) -> tuple: method _get_cover_data (line 128) | def _get_cover_data(self, pk, *, custom: bool) -> tuple: method get (line 148) | def get(self, *args, **kwargs) -> HttpResponse: FILE: codex/views/browser/download.py class GroupDownloadView (line 14) | class GroupDownloadView(BrowserFilterView): method get_object (line 22) | def get_object(self) -> tuple[str, ...]: method get (line 45) | def get(self, *_args, **kwargs) -> FileResponse: FILE: codex/views/browser/filters/bookmark.py class BrowserFilterBookmarkView (line 9) | class BrowserFilterBookmarkView(BookmarkFilterMixin, BrowserValidateView): method __init__ (line 12) | def __init__(self, *args, **kwargs) -> None: method get_bookmark_filter (line 17) | def get_bookmark_filter(self, model): FILE: codex/views/browser/filters/field.py class ComicFieldFilterView (line 25) | class ComicFieldFilterView(GroupFilterView): method _filter_by_comic_field (line 29) | def _filter_by_comic_field(field, rel_prefix, filter_list) -> Q: method get_all_comic_field_filters (line 47) | def get_all_comic_field_filters(cls, rel_prefix, filters) -> Q: method get_comic_field_filter (line 57) | def get_comic_field_filter(self, model) -> Q: FILE: codex/views/browser/filters/filter.py class BrowserFilterView (line 10) | class BrowserFilterView(BrowserFilterBookmarkView): method force_inner_joins (line 13) | def force_inner_joins(self, qs): method _get_query_filters (line 23) | def _get_query_filters( method get_filtered_queryset (line 47) | def get_filtered_queryset( FILE: codex/views/browser/filters/group.py class GroupFilterView (line 16) | class GroupFilterView(BrowserParamsView): method _get_rel_for_pks (line 21) | def _get_rel_for_pks(self, group, *, page_mtime: bool): method get_group_filter (line 37) | def get_group_filter(self, group=None, pks=None, *, page_mtime=False) ... FILE: codex/views/browser/filters/search/field/column.py function _parse_field_rel (line 32) | def _parse_field_rel(field_name, rel_class) -> tuple: function parse_field (line 49) | def parse_field(field_name: str) -> tuple: FILE: codex/views/browser/filters/search/field/expression.py function parse_size (line 34) | def parse_size(s: str) -> int: function _parse_issue_value (line 43) | def _parse_issue_value(value) -> tuple | tuple[None, None]: function _parse_issue_values (line 56) | def _parse_issue_values(rel, value, to_value=None) -> dict: function _cast_value (line 81) | def _cast_value(rel, rel_class, value) -> int | Decimal | bool | date | ... function _glob_to_lookup (line 99) | def _glob_to_lookup(value) -> tuple[str, str]: function _parse_operator_numeric (line 123) | def _parse_operator_numeric(rel, rel_class, value) -> dict[Any, int | No... function _parse_operator_text (line 130) | def _parse_operator_text(rel, exp) -> dict[Any, str] | dict: function _parse_operator (line 140) | def _parse_operator(operator, rel, rel_class, exp) -> dict: function _parse_operator_range (line 150) | def _parse_operator_range(rel, rel_class, value) -> dict: function parse_expression (line 167) | def parse_expression(rel, rel_class, exp) -> dict: FILE: codex/views/browser/filters/search/field/filter.py class BrowserFieldQueryFilter (line 14) | class BrowserFieldQueryFilter(ComicFieldFilterView): method _combine_q (line 18) | def _combine_q(q: Q, other_q: tuple[str, Any] | Q, op: str) -> Q: method _hoist_filters (line 33) | def _hoist_filters( method _parse_field_query (line 50) | def _parse_field_query( method _parse_compound_field_query (line 71) | def _parse_compound_field_query( method get_search_field_filters (line 96) | def get_search_field_filters(self, model, field_token_pairs) -> tuple[... FILE: codex/views/browser/filters/search/field/optimize.py function _like_to_regex (line 12) | def _like_to_regex(like): function _regex_like (line 42) | def _regex_like(regex, lookahead): function like_qs_to_regex_q (line 49) | def like_qs_to_regex_q(q: Q, regex_op: str, *, many_to_many: bool) -> Q: FILE: codex/views/browser/filters/search/field/parse.py class FieldQueryTransformer (line 49) | class FieldQueryTransformer(Transformer): method __init__ (line 52) | def __init__( method _prefix_q_dict (line 67) | def _prefix_q_dict(self, q_dict: dict) -> dict: method _make_operand_q (line 81) | def _make_operand_q(self, token: Token) -> Q: method QUOTED (line 89) | def QUOTED(self, token: Token) -> Q: # noqa: N802 method WORD (line 93) | def WORD(self, token: Token) -> Q: # noqa: N802 method not_op (line 97) | def not_op(self, args: list[Any]) -> Q: method or_expr (line 101) | def or_expr(self, args: list[Any]) -> Q: method and_expr (line 109) | def and_expr(self, args: list[Any]) -> Q: function get_field_query (line 118) | def get_field_query( FILE: codex/views/browser/filters/search/fts.py class BrowserFTSFilter (line 8) | class BrowserFTSFilter(BrowserFieldQueryFilter): method get_fts_filter (line 11) | def get_fts_filter(self, model, text) -> dict: FILE: codex/views/browser/filters/search/parse.py class SearchFilterView (line 76) | class SearchFilterView(BrowserFTSFilter): method __init__ (line 81) | def __init__(self, *args, **kwargs) -> None: method admin_flags (line 90) | def admin_flags(self) -> MappingProxyType[str, bool]: method _is_path_column_allowed (line 106) | def _is_path_column_allowed(self) -> bool: method _is_column_operators_used (line 111) | def _is_column_operators_used(exp) -> bool: method _add_field_token (line 118) | def _add_field_token(self, preop, col, exp, field_tokens) -> None: method _parse_column_match (line 126) | def _parse_column_match( method _add_fts_token (line 147) | def _add_fts_token(fts_tokens, token) -> None: method _preparse_search_query_token (line 161) | def _preparse_search_query_token(self, match, field_tokens, fts_tokens... method _preparse_search_query (line 182) | def _preparse_search_query(self) -> tuple[dict, str] | tuple: method _create_search_filters (line 200) | def _create_search_filters(self, model) -> tuple[list, list, Q]: method _create_search_filter (line 229) | def _create_search_filter(self, filter_list) -> Q: method get_search_filters (line 240) | def get_search_filters(self, model) -> tuple[Q, Q, Q]: method get_search_limit (line 261) | def get_search_limit(self) -> int: FILE: codex/views/browser/group_mtime.py class BrowserGroupMtimeView (line 20) | class BrowserGroupMtimeView(BrowserFilterView): method __init__ (line 23) | def __init__(self, *args, **kwargs) -> None: method is_bookmark_filtered (line 29) | def is_bookmark_filtered(self) -> bool: method _handle_operational_error (line 37) | def _handle_operational_error(self, err) -> None: method get_max_bookmark_updated_at_aggregate (line 48) | def get_max_bookmark_updated_at_aggregate( method get_group_mtime (line 65) | def get_group_mtime(self, model, group=None, pks=None, *, page_mtime=F... FILE: codex/views/browser/metadata/__init__.py class MetadataView (line 21) | class MetadataView(MetadataCopyIntersectionsView): method _get_valid_browse_nav_groups (line 32) | def _get_valid_browse_nav_groups(self, valid_top_groups) -> tuple: method _raise_not_found (line 38) | def _raise_not_found(self, exc=None) -> None: method _get_first_object (line 45) | def _get_first_object(self, qs: QuerySet): method _aggregate_multi_pk_sums (line 52) | def _aggregate_multi_pk_sums(self, filtered_qs, obj): method get_object (line 72) | def get_object(self) -> Any: method get (line 108) | def get(self, *_args, **_kwargs) -> Response: FILE: codex/views/browser/metadata/annotate.py class MetadataAnnotateView (line 19) | class MetadataAnnotateView(BrowserAnnotateCardView): method _get_comic_value_fields (line 22) | def _get_comic_value_fields(self) -> tuple: method _intersection_annotate_separate_sum_fields (line 34) | def _intersection_annotate_separate_sum_fields( method _intersection_annotate_count_sum_fields (line 47) | def _intersection_annotate_count_sum_fields( method _intersection_annotate_count_intersection_fields (line 57) | def _intersection_annotate_count_intersection_fields( method _intersection_annotate_fetch_intersecting_values (line 77) | def _intersection_annotate_fetch_intersecting_values( method _intersection_annotate (line 94) | def _intersection_annotate( method annotate_values_and_fks (line 144) | def annotate_values_and_fks(self, qs, filtered_qs): FILE: codex/views/browser/metadata/copy_intersections.py class MetadataCopyIntersectionsView (line 17) | class MetadataCopyIntersectionsView(MetadataQueryIntersectionsView): method _path_security (line 20) | def _path_security(self, obj) -> None: method _highlight_current_group (line 32) | def _highlight_current_group(self, obj) -> None: method _copy_m2m_intersections (line 42) | def _copy_m2m_intersections(cls, obj, m2m_intersections) -> None: method _copy_groups (line 58) | def _copy_groups(obj, groups) -> None: method _copy_fks (line 63) | def _copy_fks(obj, fks) -> None: method _copy_conflicting_simple_fields (line 68) | def _copy_conflicting_simple_fields(obj) -> None: method copy_intersections_into_comic_fields (line 75) | def copy_intersections_into_comic_fields( FILE: codex/views/browser/metadata/query_intersections.py class MetadataQueryIntersectionsView (line 19) | class MetadataQueryIntersectionsView(MetadataAnnotateView): method _query_groups (line 22) | def _query_groups(self) -> dict: method _get_comic_pks (line 48) | def _get_comic_pks(self, filtered_qs: QuerySet) -> frozenset[int]: method _get_fk_intersection_query (line 55) | def _get_fk_intersection_query( method _query_fk_intersections (line 71) | def _query_fk_intersections(self, comic_pks: frozenset[int]) -> dict: method _get_m2m_intersection_query (line 82) | def _get_m2m_intersection_query( method _get_optimized_m2m_query (line 96) | def _get_optimized_m2m_query(qs): method _query_m2m_intersections (line 105) | def _query_m2m_intersections(self, comic_pks: frozenset[int]) -> dict: method query_intersections (line 131) | def query_intersections(self, filtered_qs) -> tuple[dict, dict, dict]: FILE: codex/views/browser/mtime.py class MtimeView (line 14) | class MtimeView(BrowserGroupMtimeView): method _get_group_mtime (line 22) | def _get_group_mtime(self, item): method get_max_groups_mtime (line 33) | def get_max_groups_mtime(self): method get (line 43) | def get(self, *args, **kwargs) -> Response: FILE: codex/views/browser/order_by.py class BrowserOrderByView (line 8) | class BrowserOrderByView(BrowserGroupMtimeView): method __init__ (line 11) | def __init__(self, *args, **kwargs) -> None: method order_key (line 18) | def order_key(self) -> str: method _add_comic_order_by (line 30) | def _add_comic_order_by(self, order_key, comic_sort_names) -> list: method add_order_by (line 58) | def add_order_by(self, qs, order_key="", comic_sort_names=None): FILE: codex/views/browser/page_in_bounds.py class BrowserPageInBoundsView (line 10) | class BrowserPageInBoundsView(BrowserAnnotateCardView): method _get_back_one_page_route (line 13) | def _get_back_one_page_route(self, num_pages) -> dict[str, Any]: method _get_up_page_redirect (line 23) | def _get_up_page_redirect(self) -> tuple[dict, None]: method _handle_page_out_of_bounds (line 32) | def _handle_page_out_of_bounds(self, num_pages) -> None: method check_page_in_bounds (line 50) | def check_page_in_bounds(self, num_pages: int) -> None: FILE: codex/views/browser/paginate.py class BrowserPaginateView (line 13) | class BrowserPaginateView(BrowserPageInBoundsView): method _paginate_section (line 16) | def _paginate_section(self, qs: QuerySet, page: int) -> QuerySet: method _paginate_groups (line 31) | def _paginate_groups(self, group_qs: QuerySet): method _paginate_books (line 36) | def _paginate_books(self, book_qs, total_group_count, page_group_count... method paginate (line 59) | def paginate( FILE: codex/views/browser/params.py class BrowserParamsView (line 16) | class BrowserParamsView(BrowserSettingsBaseView): method __init__ (line 23) | def __init__(self, *args, **kwargs) -> None: method init_params (line 28) | def init_params(self) -> MutableMapping[str, Any]: method _update_last_route (line 37) | def _update_last_route(self, data: MutableMapping) -> None: method set_params (line 49) | def set_params(self, params: Mapping) -> None: method params (line 54) | def params(self) -> MappingProxyType: FILE: codex/views/browser/saved_settings.py function _validate_filter_field (line 70) | def _validate_filter_field( function _validate_filter_pks (line 94) | def _validate_filter_pks( class _SavedSettingsOwnerMixin (line 119) | class _SavedSettingsOwnerMixin: method _get_user_and_session (line 122) | def _get_user_and_session(self): method _owner_kwargs (line 130) | def _owner_kwargs(self): class SavedBrowserSettingsListView (line 137) | class SavedBrowserSettingsListView(_SavedSettingsOwnerMixin, AuthFilterG... method get (line 142) | def get(self, *args, **kwargs) -> Response: method _copy_settings (line 155) | def _copy_settings(source: SettingsBrowser, target: SettingsBrowser): method post (line 178) | def post(self, *args, **kwargs) -> Response: class SavedBrowserSettingsLoadView (line 248) | class SavedBrowserSettingsLoadView(SettingsBaseView): method _owner_kwargs (line 258) | def _owner_kwargs(self): method get (line 265) | def get(self, *args, **kwargs) -> Response: method delete (line 293) | def delete(self, *args, **kwargs) -> Response: FILE: codex/views/browser/settings.py class BrowserSettingsBaseView (line 26) | class BrowserSettingsBaseView(SettingsBaseView): method set_order_by_default (line 34) | def set_order_by_default(self, params: MutableMapping) -> None: method reset_browser_settings (line 48) | def reset_browser_settings(self) -> dict: class BrowserSettingsView (line 81) | class BrowserSettingsView(BrowserSettingsBaseView): method _validate_browse_top_group (line 92) | def _validate_browse_top_group(params, group: str, top_group: str) -> ... method _validate_top_group (line 110) | def _validate_top_group(cls, params, group: str, top_group: str) -> None: method _validate_settings_get (line 120) | def _validate_settings_get(self, validated_data, params: dict) -> dict: method get (line 133) | def get(self, *args, **kwargs) -> Response: method patch (line 145) | def patch(self, *args, **kwargs) -> Response: method delete (line 158) | def delete(self, *args, **kwargs) -> Response: FILE: codex/views/browser/title.py class BrowserTitleView (line 9) | class BrowserTitleView(BrowserBreadcrumbsView): method _get_root_group_name (line 12) | def _get_root_group_name(self) -> tuple: method _get_group_name (line 22) | def _get_group_name(self) -> tuple: method get_browser_page_title (line 36) | def get_browser_page_title(self) -> Mapping: FILE: codex/views/browser/validate.py class BrowserValidateView (line 25) | class BrowserValidateView(SearchFilterView): method __init__ (line 32) | def __init__(self, *args, **kwargs) -> None: method model_group (line 42) | def model_group(self) -> str: method model (line 52) | def model(self) -> type[BrowserGroupModel] | None: method rel_prefix (line 65) | def rel_prefix(self) -> str: method raise_redirect (line 71) | def raise_redirect( method _get_valid_browse_top_groups (line 84) | def _get_valid_browse_top_groups(self) -> list: method _validate_top_group (line 101) | def _validate_top_group(self, valid_top_groups) -> None: method _get_valid_browse_nav_groups (line 119) | def _get_valid_browse_nav_groups(self, valid_top_groups) -> tuple: method _validate_folder_settings (line 145) | def _validate_folder_settings(self) -> tuple: method _validate_browser_group_settings (line 158) | def _validate_browser_group_settings(self) -> tuple: method _validate_story_arc_settings (line 177) | def _validate_story_arc_settings(self) -> tuple[str, ...]: method valid_nav_groups (line 184) | def valid_nav_groups(self) -> tuple[str, ...]: FILE: codex/views/download.py class DownloadView (line 13) | class DownloadView(AuthFilterAPIView): method get (line 21) | def get(self, *_args, **kwargs) -> FileResponse: class FileView (line 55) | class FileView(DownloadView): FILE: codex/views/error.py function codex_exception_handler (line 10) | def codex_exception_handler( FILE: codex/views/exceptions.py class SeeOtherRedirectError (line 35) | class SeeOtherRedirectError(APIException): method _copy_params_into (line 43) | def _copy_params_into( method __init__ (line 53) | def __init__(self, detail) -> None: method _get_query_params (line 82) | def _get_query_params(self) -> dict: method get_response (line 91) | def get_response(self, url_name) -> HttpResponseRedirect: class NoContent (line 99) | class NoContent(APIException): FILE: codex/views/frontend.py class IndexView (line 15) | class IndexView(BrowserSettingsBaseView, UserActiveMixin): method _get_last_route (line 22) | def _get_last_route(self) -> ReturnDict: method get (line 28) | def get(self, *_args, **_kwargs) -> Response: FILE: codex/views/healthcheck.py function health_check_view (line 6) | def health_check_view(request) -> HttpResponse: # noqa: ARG001 FILE: codex/views/lazy_import.py class LazyImportView (line 11) | class LazyImportView(AuthGenericAPIView): method get (line 16) | def get(self, *args, **kwargs) -> Response: FILE: codex/views/mixins.py class SharedAnnotationsMixin (line 23) | class SharedAnnotationsMixin: # (BrowserFilterView): method _get_order_group (line 27) | def _get_order_group( method _get_order_groups (line 42) | def _get_order_groups(cls, parent_group, pks, show) -> tuple: method get_sort_name_annotations (line 57) | def get_sort_name_annotations(cls, model, parent_group, pks, show) -> ... method _volume_name_annotation (line 73) | def _volume_name_annotation(model) -> Case: method annotate_group_names (line 89) | def annotate_group_names(cls, qs): class UserActiveMixin (line 114) | class UserActiveMixin: method mark_user_active (line 117) | def mark_user_active(self) -> None: FILE: codex/views/opds/auth.py class OPDSAuthMixin (line 13) | class OPDSAuthMixin(AuthMixin): method user_agent_name (line 23) | def user_agent_name(self) -> str: FILE: codex/views/opds/authentication/v1.py class OPDSAuthentication1View (line 51) | class OPDSAuthentication1View(GenericAPIView): method _absolute_doc (line 57) | def _absolute_doc(request) -> dict: method static_get (line 67) | def static_get(cls, request, status_code=status.HTTP_200_OK) -> JsonRe... method get (line 77) | def get(self, *args, **kwargs) -> JsonResponse: FILE: codex/views/opds/binary.py class IgnoreClientContentNegotiation (line 14) | class IgnoreClientContentNegotiation(BaseContentNegotiation): method select_parser (line 18) | def select_parser(self, request, parsers): method select_renderer (line 23) | def select_renderer( class OPDSCoverView (line 34) | class OPDSCoverView(OPDSBrowserSettingsMixin, CoverView): class OPDSDownloadView (line 38) | class OPDSDownloadView(OPDSAuthMixin, DownloadView): class OPDSPageView (line 42) | class OPDSPageView(OPDSAuthMixin, ReaderPageView): FILE: codex/views/opds/const.py class BookmarkFilters (line 20) | class BookmarkFilters: class Rel (line 29) | class Rel: class MimeType (line 56) | class MimeType: class UserAgentNames (line 100) | class UserAgentNames: class TopRoutes (line 109) | class TopRoutes: FILE: codex/views/opds/error.py function _get_url_name (line 30) | def _get_url_name(request: HttpRequest, name_suffix: str) -> str: function _get_redirect_to_start_response (line 35) | def _get_redirect_to_start_response(request: HttpRequest) -> HttpRespons... function codex_opds_exception_handler (line 42) | def codex_opds_exception_handler( FILE: codex/views/opds/feed.py class OPDSBrowserView (line 12) | class OPDSBrowserView(OPDSBrowserSettingsMixin, UserActiveMixin, Browser... method __init__ (line 18) | def __init__(self, *args, **kwargs) -> None: FILE: codex/views/opds/metadata.py function get_credit_people (line 26) | def get_credit_people(comic_pks: Sequence[int], roles: Iterable[str], *,... function get_credits (line 38) | def get_credits( function get_m2m_objects (line 50) | def get_m2m_objects(pks: Sequence[int]) -> dict: FILE: codex/views/opds/opensearch/v1.py class OpenSearch1View (line 14) | class OpenSearch1View(OPDSAuthMixin, CodexXMLTemplateMixin, CodexAPIView... FILE: codex/views/opds/settings.py class OPDSSettingsMixin (line 9) | class OPDSSettingsMixin(OPDSAuthMixin, ABC): class OPDSBrowserSettingsMixin (line 16) | class OPDSBrowserSettingsMixin(OPDSSettingsMixin): FILE: codex/views/opds/start.py class OPDSStartViewMixin (line 7) | class OPDSStartViewMixin: method init_params (line 12) | def init_params(self) -> MutableMapping[str, Any]: method _get_group_queryset (line 16) | def _get_group_queryset(self) -> tuple: FILE: codex/views/opds/urls.py class OPDSURLsView (line 15) | class OPDSURLsView(AuthGenericAPIView): method get (line 20) | def get(self, *args, **kwargs) -> Response: FILE: codex/views/opds/user_agent.py function get_user_agent_name (line 6) | def get_user_agent_name(request: Request) -> str: FILE: codex/views/opds/v1/const.py class TopLink (line 21) | class TopLink: class TopLinks (line 34) | class TopLinks: class RootTopLinks (line 50) | class RootTopLinks: class OPDS1Link (line 97) | class OPDS1Link: class FacetGroup (line 114) | class FacetGroup: class Facet (line 124) | class Facet: class FacetGroups (line 131) | class FacetGroups: class RootFacetGroups (line 153) | class RootFacetGroups: class OpdsNs (line 170) | class OpdsNs: class OPDS1EntryObject (line 178) | class OPDS1EntryObject: class OPDS1EntryData (line 190) | class OPDS1EntryData: FILE: codex/views/opds/v1/entry/entry.py class OPDS1Entry (line 24) | class OPDS1Entry(OPDS1EntryLinksMixin): method id_tag (line 28) | def id_tag(self) -> str: method title (line 34) | def title(self) -> str: method issued (line 67) | def issued(self) -> str: method publisher (line 77) | def publisher(self): method _get_datefield (line 81) | def _get_datefield(self, key) -> datetime | None: method updated (line 94) | def updated(self) -> datetime | None: method published (line 99) | def published(self) -> datetime | None: method language (line 104) | def language(self): method summary (line 109) | def summary(self): method _add_url_to_obj (line 119) | def _add_url_to_obj(objs, filter_key) -> list: method authors (line 132) | def authors(self) -> list: method contributors (line 140) | def contributors(self) -> list: method category_groups (line 148) | def category_groups(self) -> dict: FILE: codex/views/opds/v1/entry/links.py class OPDS1EntryLinksMixin (line 17) | class OPDS1EntryLinksMixin: method __init__ (line 20) | def __init__( method _cover_link (line 38) | def _cover_link(self, rel) -> OPDS1Link | None: method _nav_href (line 54) | def _nav_href(self, *, metadata: bool) -> str: method _nav_link (line 80) | def _nav_link(self, *, metadata: bool) -> OPDS1Link: method _download_link (line 96) | def _download_link(self) -> OPDS1Link | None: method lazy_metadata (line 106) | def lazy_metadata(self) -> bool: method _stream_link (line 116) | def _stream_link(self) -> OPDS1Link | None: method _links_comic (line 138) | def _links_comic(self) -> list: method links (line 150) | def links(self) -> list: FILE: codex/views/opds/v1/facets.py class OPDS1FacetsView (line 25) | class OPDS1FacetsView(CodexXMLTemplateMixin, OPDSBrowserView): method __init__ (line 31) | def __init__(self, *args, **kwargs) -> None: method mime_type_map (line 40) | def mime_type_map(self) -> MappingProxyType[str, str]: method use_facets (line 51) | def use_facets(self) -> bool: method obj (line 58) | def obj(self) -> MappingProxyType[str, Any]: method _facet (line 80) | def _facet(self, kwargs, facet_group, facet_title, new_query_params) -... method _facet_entry (line 102) | def _facet_entry(self, item, facet_group, facet, query_params) -> OPDS... method _is_facet_active (line 122) | def _is_facet_active(self, facet_group, facet) -> bool: method _did_special_group_change (line 130) | def _did_special_group_change(group, facet_group) -> bool: method _facet_or_facet_entry (line 139) | def _facet_or_facet_entry(self, facet_group, facet, *, entries: bool): method _facet_group (line 156) | def _facet_group(self, facet_group, *, entries: bool) -> list: method facets (line 173) | def facets(self, *, entries: bool) -> list: FILE: codex/views/opds/v1/feed.py class OPDS1FeedView (line 28) | class OPDS1FeedView(OPDS1LinksView): method version (line 38) | def version(self): method opds_ns (line 43) | def opds_ns(self): method is_acquisition (line 51) | def is_acquisition(self) -> bool: method id_tag (line 56) | def id_tag(self): method title (line 64) | def title(self) -> str: method updated (line 84) | def updated(self) -> str: method items_per_page (line 96) | def items_per_page(self) -> int | None: method total_results (line 105) | def total_results(self): method _get_entries_section (line 113) | def _get_entries_section(self, key, metadata) -> list: method entries (line 139) | def entries(self) -> list: method get (line 162) | def get(self, *_args, **_kwargs) -> Response: class OPDS1StartView (line 169) | class OPDS1StartView(OPDSStartViewMixin, OPDS1FeedView): method get (line 177) | def get(self, *args, **kwargs) -> Response: FILE: codex/views/opds/v1/links.py class OPDS1LinksView (line 20) | class OPDS1LinksView(OPDS1FacetsView): method is_top_link_displayed (line 23) | def is_top_link_displayed(self, top_link) -> bool: method _link (line 35) | def _link( method _top_link (line 45) | def _top_link(self, top_link): method _root_links (line 51) | def _root_links(self) -> list: method _links_start_page_links (line 69) | def _links_start_page_links(self) -> list: method _links_facets (line 78) | def _links_facets(self) -> list: method links (line 90) | def links(self) -> list: method _top_link_entry (line 116) | def _top_link_entry(self, top_link) -> OPDS1Entry: method add_start_link (line 136) | def add_start_link(self) -> list[OPDS1Entry]: method add_top_links (line 149) | def add_top_links(self, top_links) -> list: FILE: codex/views/opds/v2/const.py class HrefData (line 14) | class HrefData: class LinkData (line 27) | class LinkData: class Link (line 44) | class Link: class LinkGroup (line 56) | class LinkGroup: FILE: codex/views/opds/v2/feed/__init__.py class OPDS2FeedView (line 27) | class OPDS2FeedView(OPDS2FeedGroupsView): method _subtitle_filters (line 35) | def _subtitle_filters(self, qps: Mapping) -> list[str]: method _subtitle (line 57) | def _subtitle(self) -> str: method _title (line 75) | def _title(self, browser_title: Mapping[str, str]): method _feed_metadata (line 91) | def _feed_metadata(self, title: str, mtime: datetime | None) -> Mappin... method _feed_navigation_and_groups (line 106) | def _feed_navigation_and_groups( method _update_feed_modified (line 138) | def _update_feed_modified( method get_object (line 145) | def get_object(self) -> MappingProxyType: method get (line 180) | def get(self, *_args, **_kwargs) -> Response: class OPDS2StartView (line 188) | class OPDS2StartView(OPDSStartViewMixin, OPDS2FeedView): method _update_feed_modified (line 193) | def _update_feed_modified( method get (line 211) | def get(self, *args, **kwargs) -> Response: FILE: codex/views/opds/v2/feed/feed_links.py class OPDS2FeedLinksView (line 13) | class OPDS2FeedLinksView(OPDS2LinksView): method _link_auth (line 16) | def _link_auth(self): method _link_search (line 28) | def _link_search(self): method _get_static_links (line 38) | def _get_static_links(self): method _top_route (line 67) | def _top_route(self) -> dict[str, Any]: method _link_page (line 71) | def _link_page(self, rel, page): method get_links (line 78) | def get_links(self, up_route): FILE: codex/views/opds/v2/feed/groups.py class OPDS2FeedGroupsView (line 23) | class OPDS2FeedGroupsView(OPDS2PublicationsView): method _create_link_kwargs (line 30) | def _create_link_kwargs( method _create_link_query_params (line 46) | def _create_link_query_params( method _create_links_from_link_spec (line 65) | def _create_links_from_link_spec( method _create_group_from_group_spec (line 102) | def _create_group_from_group_spec( method _create_group (line 131) | def _create_group(self, group_specs, *, paginate: bool = False) -> list: method get_top_groups (line 138) | def get_top_groups(self): method get_ordered_groups (line 142) | def get_ordered_groups(self) -> list: method get_start_groups (line 152) | def get_start_groups(self): method get_groups (line 156) | def get_groups(self, group_qs, book_qs, title: str, zero_pad: int): method get_facets (line 172) | def get_facets(self): FILE: codex/views/opds/v2/feed/links.py class OPDS2LinksView (line 20) | class OPDS2LinksView(OPDS2HrefMixin, OPDSBrowserView): method __init__ (line 25) | def __init__(self, *args, **kwargs) -> None: method group_and_books (line 35) | def group_and_books( method num_pages (line 46) | def num_pages(self) -> int: method _link_attributes (line 53) | def _link_attributes(data, link) -> None: method _link_properties (line 67) | def _link_properties(data, link) -> None: method link (line 76) | def link(self, data: LinkData) -> dict | None: method _normalize_query_params (line 93) | def _normalize_query_params(qps_dict) -> frozenset: method _is_self_link (line 102) | def _is_self_link(self, href) -> bool: method link_aggregate (line 115) | def link_aggregate(self, link_dict, link) -> None: method get_links_from_dict (line 131) | def get_links_from_dict(link_dict) -> list: method link_self (line 142) | def link_self(self): FILE: codex/views/opds/v2/feed/publications.py class OPDS2PublicationBaseView (line 27) | class OPDS2PublicationBaseView(OPDS2FeedLinksView): method __init__ (line 30) | def __init__(self, *args, **kwargs) -> None: method is_allowed (line 36) | def is_allowed(link_spec: Link | BrowserGroupModel) -> bool: method _publication_metadata (line 58) | def _publication_metadata(self, obj, zero_pad) -> dict: method auth_link (line 83) | def auth_link(self): method _publication_link (line 95) | def _publication_link(self, kwargs, url_name, rel, mime_type, size=None): method _publication (line 102) | def _publication(self, obj, zero_pad) -> dict: method _thumb (line 141) | def _thumb(self, obj) -> list: class OPDS2PublicationsView (line 171) | class OPDS2PublicationsView(OPDS2PublicationBaseView): method _publication (line 175) | def _publication(self, obj, zero_pad) -> dict: method _get_publications_links (line 181) | def _get_publications_links(self, link_spec) -> list: method _get_publication_section_metadata (line 190) | def _get_publication_section_metadata( method get_publications (line 209) | def get_publications( method _get_publications_preview_feed_view (line 241) | def _get_publications_preview_feed_view(self, link_spec: Link): method get_publications_preview (line 256) | def get_publications_preview(self, link_spec: Link) -> list: FILE: codex/views/opds/v2/href.py class OPDS2HrefMixin (line 15) | class OPDS2HrefMixin: method num_pages (line 19) | def num_pages(self) -> int: method _href_page_validate (line 23) | def _href_page_validate(self, kwargs, data) -> bool: method _href_update_query_params (line 30) | def _href_update_query_params(self, data) -> dict: method href (line 48) | def href(self, data) -> str | None: FILE: codex/views/opds/v2/manifest.py class OPDS2ManifestMetadataView (line 55) | class OPDS2ManifestMetadataView(OPDS2PublicationBaseView): method _publication_identifier (line 58) | def _publication_identifier(self, obj) -> str: method _publication_belongs_to_link (line 73) | def _publication_belongs_to_link( method _publication_belongs_to_series (line 92) | def _publication_belongs_to_series(self, obj): method _publication_belongs_to_folder (line 109) | def _publication_belongs_to_folder(self, obj) -> list: method _publication_belongs_to_story_arcs (line 122) | def _publication_belongs_to_story_arcs(self, obj) -> list: method _publication_belongs_to (line 146) | def _publication_belongs_to(self, obj) -> dict: method _add_tag_link (line 157) | def _add_tag_link(self, obj: BaseModel, filter_key: str, subfield: str... method _publication_subject (line 176) | def _publication_subject(self, obj) -> tuple[NamedModel, ...]: method _add_credits (line 186) | def _add_credits(self, pks, roles) -> QuerySet[Credit] | None: method _publication_credits (line 194) | def _publication_credits(self, obj) -> Mapping[str, tuple[Credit, ...]]: method _publication_metadata (line 202) | def _publication_metadata(self, obj, zero_pad) -> dict: class OPDS2ManifestView (line 226) | class OPDS2ManifestView(OPDS2ManifestMetadataView): method _publication_reading_order (line 231) | def _publication_reading_order(self, obj) -> list: method _cover (line 261) | def _cover(self, obj) -> list: method _publication (line 290) | def _publication(self, obj, zero_pad) -> dict: method get_object (line 300) | def get_object(self) -> MappingProxyType: FILE: codex/views/opds/v2/progression.py class ReadiumProgressionParser (line 44) | class ReadiumProgressionParser(JSONParser): class ReadiumProgressionAPIRenderer (line 50) | class ReadiumProgressionAPIRenderer(JSONRenderer): class OPDS2ProgressionView (line 59) | class OPDS2ProgressionView( method __init__ (line 79) | def __init__(self, *args, **kwargs) -> None: method modified (line 87) | def modified(self): method device (line 92) | def device(self): method title (line 97) | def title(self) -> str: method _progression_href (line 102) | def _progression_href(self): method _locations (line 115) | def _locations(self) -> dict[str, Any]: method locator (line 126) | def locator(self) -> dict[str, Any]: method _get_bookmark_query (line 135) | def _get_bookmark_query(self) -> QuerySet: method get_object (line 159) | def get_object(self) -> dict[str, Any]: method get (line 185) | def get(self, *args, **kwargs) -> Response: method put (line 200) | def put(self, *_args, **_kwargs) -> Response: FILE: codex/views/public.py class AdminFlagsView (line 22) | class AdminFlagsView(GenericAPIView, RetrieveModelMixin): method get_object (line 31) | def get_object(self) -> dict: method get (line 40) | def get(self, *args, **kwargs) -> Response: FILE: codex/views/pwa.py class WebManifestView (line 6) | class WebManifestView(CodexTemplateView): class ServiceWorkerRegisterView (line 13) | class ServiceWorkerRegisterView(CodexTemplateView): class ServiceWorkerView (line 20) | class ServiceWorkerView(CodexTemplateView): FILE: codex/views/reader/arcs.py class ReaderArcsView (line 26) | class ReaderArcsView(ReaderParamsView): method _get_field_names (line 29) | def _get_field_names(self) -> tuple: method _get_group_arc (line 51) | def _get_group_arc( method _get_story_arcs (line 67) | def _get_story_arcs(self, comic: Comic, arcs, max_mtime: int | None): method _set_selected_arc (line 97) | def _set_selected_arc(self, arcs) -> None: method get_arcs (line 118) | def get_arcs(self) -> tuple[dict, int | None]: FILE: codex/views/reader/books.py class ReaderBooksView (line 40) | class ReaderBooksView(ReaderArcsView, SharedAnnotationsMixin, BookmarkAu... method _get_reader_settings_auth_filter (line 43) | def _get_reader_settings_auth_filter(self) -> dict: method _append_with_settings (line 49) | def _append_with_settings(self, book): method _raise_not_found (line 61) | def _raise_not_found(self) -> None: method _get_comics_filter (line 71) | def _get_comics_filter(self, rel): method _get_comics_annotation_and_ordering (line 83) | def _get_comics_annotation_and_ordering( method _get_comics_list (line 99) | def _get_comics_list(self) -> QuerySet: method get_book_collection (line 142) | def get_book_collection(self) -> dict: FILE: codex/views/reader/page.py class ReaderPageView (line 25) | class ReaderPageView(BookmarkAuthMixin, AuthFilterAPIView): method _update_bookmark (line 31) | def _update_bookmark(self) -> None: method _get_page_image (line 48) | def _get_page_image(self) -> tuple: method get (line 89) | def get(self, *_args, **_kwargs) -> HttpResponse: FILE: codex/views/reader/params.py class ReaderParamsView (line 13) | class ReaderParamsView(ReaderSettingsBaseView): method __init__ (line 18) | def __init__(self, *args, **kwargs) -> None: method _ensure_arc_group (line 24) | def _ensure_arc_group(self, params: dict[str, Any]) -> None: method _ensure_arc_ids (line 37) | def _ensure_arc_ids(params: dict[str, Any]) -> None: method _ensure_arc (line 45) | def _ensure_arc(self, params: dict[str, Any]) -> None: method params (line 54) | def params(self): FILE: codex/views/reader/reader.py class ReaderView (line 14) | class ReaderView(ReaderBooksView): method get_object (line 22) | def get_object(self) -> dict[str, Mapping | int | None]: method get (line 45) | def get(self, *args, **kwargs) -> Response: FILE: codex/views/reader/settings.py class ReaderSettingsBaseView (line 44) | class ReaderSettingsBaseView(SettingsBaseView): method get_reader_default_params (line 64) | def get_reader_default_params(cls) -> dict: method reset_reader_settings (line 72) | def reset_reader_settings(cls, instance: SettingsReader) -> dict: method _get_bookmark_auth_filter (line 83) | def _get_bookmark_auth_filter(self) -> dict[str, int | str | None]: method _get_settings_lookup (line 94) | def _get_settings_lookup(self, **extra): method _instance_to_dict (line 100) | def _instance_to_dict(instance: SettingsReader | None) -> dict | None: method _get_global_settings (line 106) | def _get_global_settings(self) -> SettingsReader: method _get_scoped_settings (line 119) | def _get_scoped_settings(self, scope_fk_field: str, scope_pk: int): method _get_or_create_scoped_settings (line 124) | def _get_or_create_scoped_settings( class ReaderSettingsView (line 135) | class ReaderSettingsView(ReaderSettingsBaseView): method _resolve_scope_pk (line 156) | def _resolve_scope_pk( method _canonical_scope (line 171) | def _canonical_scope(scope: str) -> str: method _get_scope (line 177) | def _get_scope(self, scope, scopes_out, comic, scope_info) -> None: method get (line 213) | def get(self, *args, **kwargs) -> Response: method patch (line 242) | def patch(self, *args, **kwargs) -> Response: method delete (line 280) | def delete(self, *args, **kwargs) -> Response: FILE: codex/views/settings.py class SettingsBaseView (line 35) | class SettingsBaseView(AuthFilterGenericAPIView, ABC): method _ensure_session_key (line 58) | def _ensure_session_key(self) -> str | None: method _get_request_user (line 64) | def _get_request_user(self): method _get_field_default (line 74) | def _get_field_default(model, field_name): method _get_or_create_settings_user (line 82) | def _get_or_create_settings_user( method _get_or_create_settings_session (line 109) | def _get_or_create_settings_session( method _create_browser_settings (line 132) | def _create_browser_settings(user, session_key, client, create_args): method _get_or_create_settings (line 154) | def _get_or_create_settings( method browser_instance_to_dict (line 208) | def browser_instance_to_dict(instance: SettingsBrowser) -> dict: method _reader_instance_to_dict (line 240) | def _reader_instance_to_dict(instance: SettingsReader) -> dict: method _load_settings_data (line 246) | def _load_settings_data(self, only: Sequence[str] | None = None) -> dict: method _load_browser_settings_data (line 259) | def _load_browser_settings_data(self, only: Sequence[str] | None = Non... method get_from_settings (line 270) | def get_from_settings(self, key: str, default=None, *, browser: bool =... method get_last_route (line 283) | def get_last_route(self) -> Mapping: method get_browser_default_params (line 290) | def get_browser_default_params(cls) -> dict: method load_params_from_settings (line 313) | def load_params_from_settings(self, only: Sequence[str] | None = None)... method _get_browser_order_defaults (line 323) | def _get_browser_order_defaults(self) -> dict: method _save_browser_show (line 339) | def _save_browser_show(instance: SettingsBrowser, show_data: dict) -> ... method _save_browser_filters (line 346) | def _save_browser_filters( method _save_browser_last_route (line 359) | def _save_browser_last_route( method _save_browser_settings_data (line 374) | def _save_browser_settings_data(cls, instance: SettingsBrowser, data: ... method _save_reader_settings_data (line 391) | def _save_reader_settings_data(instance: SettingsReader, data: dict) -... method _save_settings_data (line 398) | def _save_settings_data(self, data: dict) -> None: method save_params_to_settings (line 411) | def save_params_to_settings(self, params) -> None: # reader session &... FILE: codex/views/template.py class TemplateXMLRenderer (line 11) | class TemplateXMLRenderer(TemplateHTMLRenderer): class CodexAPIView (line 18) | class CodexAPIView(APIView): method get (line 24) | def get(self, *args, **kwargs) -> Response: class CodexTemplateView (line 31) | class CodexTemplateView(CodexAPIView): class CodexXMLTemplateMixin (line 39) | class CodexXMLTemplateMixin: FILE: codex/views/timezone.py class TimezoneView (line 13) | class TimezoneView(AuthGenericAPIView): method _save_timezone (line 19) | def _save_timezone(self, django_timezone) -> None: method put (line 28) | def put(self, *args, **kwargs) -> Response: FILE: codex/views/util.py class Route (line 9) | class Route: method __hash__ (line 18) | def __hash__(self) -> int: method __eq__ (line 25) | def __eq__(self, cmp) -> bool: function pop_name (line 30) | def pop_name(kwargs: Mapping) -> Mapping: FILE: codex/views/version.py class VersionView (line 16) | class VersionView(AuthGenericAPIView): method get_object (line 22) | def get_object(self) -> dict[str, str]: method get (line 36) | def get(self, *args, **kwargs) -> Response: FILE: codex/websockets/consumers.py class NotifierConsumer (line 12) | class NotifierConsumer(AsyncWebsocketConsumer): method _get_groups (line 15) | def _get_groups(self) -> list[str]: method websocket_connect (line 33) | async def websocket_connect(self, message) -> None: method disconnect (line 42) | async def disconnect(self, code) -> None: method send_text (line 46) | async def send_text(self, event) -> None: FILE: codex/websockets/listener.py class BroadcastListener (line 15) | class BroadcastListener: method __init__ (line 28) | def __init__(self, logger_, queue) -> None: method broadcast_group (line 34) | async def broadcast_group(self, event) -> None: method shutdown (line 43) | async def shutdown(self) -> None: method listen (line 55) | async def listen(self) -> None: FILE: frontend/bin/roman.py function build_ignore_spec (line 46) | def build_ignore_spec(ignore_path: Path | None) -> PathSpec: function read_first_two_lines (line 56) | def read_first_two_lines(path: Path) -> tuple[str, str]: function is_shell_script (line 70) | def is_shell_script(line1: str) -> bool: function has_description_comment (line 75) | def has_description_comment(line2: str) -> bool: function iter_files (line 80) | def iter_files(path_strs: Sequence[str], spec: PathSpec) -> Generator[Pa... function build_parser (line 120) | def build_parser() -> ArgumentParser: function _parse_ignore_file (line 145) | def _parse_ignore_file(args: Namespace) -> PathSpec: function main (line 160) | def main() -> None: FILE: frontend/src/api/v3/base.js constant CONFIG (line 2) | const CONFIG = { constant HTTP (line 6) | const HTTP = xior.create(CONFIG); constant COOKIE_NAME (line 9) | const COOKIE_NAME = "csrftoken"; constant CSRF_HEADER (line 10) | const CSRF_HEADER = "X-CSRFToken"; constant CSRF_COOKIE_REGEX (line 11) | const CSRF_COOKIE_REGEX = RegExp("(?:^|;)\\s*" + COOKIE_NAME + "=([^;]*)"); FILE: frontend/src/api/v3/notify.js constant WS_PATH (line 2) | const WS_PATH = `${globalThis.CODEX.API_V3_PATH}ws`; function getSocketURL (line 3) | function getSocketURL() { constant WS_URL (line 9) | const WS_URL = getSocketURL(); FILE: frontend/src/api/v3/vuetify-items.js constant NULL_PKS (line 3) | const NULL_PKS = new Set(["", VUETIFY_NULL_CODE, undefined, null]); FILE: frontend/src/components/admin/create-update-dialog/create-update-inputs-mixin.js method data (line 26) | data() { method handler (line 39) | handler(to) { method handler (line 45) | handler(to) { FILE: frontend/src/components/admin/use-now-timer.js constant TICK_INTERVAL_MS (line 8) | const TICK_INTERVAL_MS = 1000; function useNowTimer (line 14) | function useNowTimer() { FILE: frontend/src/components/auth/auth-form-mixin.js method setup (line 21) | setup() { method data (line 28) | data() { method handler (line 41) | handler() { FILE: frontend/src/datetime.js constant TWENTY_FOUR_HOUR_LOCALE (line 8) | const TWENTY_FOUR_HOUR_LOCALE = "sv-SE"; constant DATE_FORMAT (line 9) | const DATE_FORMAT = new Intl.DateTimeFormat(TWENTY_FOUR_HOUR_LOCALE); constant NUMBER_FORMAT (line 10) | const NUMBER_FORMAT = new Intl.NumberFormat(); constant DURATION_FORMAT (line 11) | const DURATION_FORMAT = new Intl.DurationFormat("en", { constant MINUTE_SECONDS (line 17) | const MINUTE_SECONDS = 60; constant HOUR_SECONDS (line 18) | const HOUR_SECONDS = MINUTE_SECONDS * 60; constant DAY_SECONDS (line 19) | const DAY_SECONDS = HOUR_SECONDS * 24; FILE: frontend/src/platform.js constant IS_MOBILE (line 7) | const IS_MOBILE = _IS_MOBILE_UA || globalThis.orientation !== undefined; FILE: frontend/src/plugins/drag-scroll.js constant DRAG_THRESHOLD (line 2) | const DRAG_THRESHOLD = 4; method mounted (line 5) | mounted(el, binding) { method unmounted (line 58) | unmounted(el) { FILE: frontend/src/plugins/router.js constant LAST_ROUTE (line 16) | const LAST_ROUTE = { FILE: frontend/src/plugins/vuetify.js constant WHITE (line 4) | const WHITE = "#FFFFFF"; constant DISABLED (line 5) | const DISABLED = "#808080"; FILE: frontend/src/route.js constant REVERSE_READING_DIRECTIONS (line 1) | const REVERSE_READING_DIRECTIONS = Object.freeze(new Set("rtl", "btt")); FILE: frontend/src/stores/admin.js constant IRREGULAR_PLURALS (line 9) | const IRREGULAR_PLURALS = Object.freeze({ constant TABS (line 13) | const TABS = Object.freeze([ method isUserAdmin (line 48) | isUserAdmin() { method normalLibraries (line 52) | normalLibraries() { method customCoverLibraries (line 63) | customCoverLibraries() { method doNormalComicLibrariesExist (line 74) | doNormalComicLibrariesExist() { method _requireAdmin (line 80) | _requireAdmin() { method loadTable (line 83) | async loadTable(table) { method loadTables (line 101) | loadTables(tables) { method loadFolders (line 107) | async loadFolders(path, showHidden) { method clearFolders (line 116) | async clearFolders(root) { method createRow (line 120) | async createRow(table, data) { method updateRow (line 131) | async updateRow(table, pk, data) { method changeUserPassword (line 142) | async changeUserPassword(pk, data) { method deleteRow (line 152) | async deleteRow(table, pk) { method librarianTask (line 163) | async librarianTask(task, text, libraryId) { method nameSet (line 170) | nameSet(rows, nameKey, oldRow, dupeCheck) { method loadStats (line 182) | async loadStats() { method loadAllStatuses (line 191) | async loadAllStatuses() { method updateAPIKey (line 206) | async updateAPIKey() { FILE: frontend/src/stores/auth.js method isAuthorized (line 26) | isAuthorized() { method isAuthChecked (line 29) | isAuthChecked() { method isUserAdmin (line 34) | isUserAdmin() { method isAuthDialogOpen (line 37) | isAuthDialogOpen() { method isBanner (line 40) | isBanner(state) { method loadAdminFlags (line 45) | async loadAdminFlags() { method loadProfile (line 53) | async loadProfile() { method login (line 61) | async login(credentials, clear = true) { method register (line 72) | async register(credentials) { method logout (line 81) | logout() { method changePassword (line 89) | async changePassword(credentials) { method setTimezone (line 102) | async setTimezone() { method getToken (line 107) | async getToken() { method updateToken (line 112) | async updateToken() { FILE: frontend/src/stores/browser-select-many.js method selectedCount (line 41) | selectedCount(state) { method isSelected (line 44) | isSelected(state) { method hasSelection (line 47) | hasSelection(state) { method compositeItem (line 54) | compositeItem(state) { method deactivate (line 80) | deactivate() { method toggleItem (line 84) | toggleItem(item) { method selectAll (line 101) | selectAll() { method clearSelection (line 114) | clearSelection() { method markFinished (line 118) | async markFinished(finished) { method download (line 137) | download() { FILE: frontend/src/stores/browser.js constant GROUPS (line 14) | const GROUPS = Object.freeze("rpisvc"); constant GROUPS_REVERSED (line 15) | const GROUPS_REVERSED = Object.freeze([...GROUPS].reverse().join("")); constant HTTP_REDIRECT_CODES (line 16) | const HTTP_REDIRECT_CODES = Object.freeze(new Set([301, 302, 303, 307, 3... constant DEFAULT_BOOKMARK_VALUES (line 17) | const DEFAULT_BOOKMARK_VALUES = Object.freeze( constant ALWAYS_ENABLED_TOP_GROUPS (line 20) | const ALWAYS_ENABLED_TOP_GROUPS = Object.freeze(new Set(["a", "c"])); constant NO_REDIRECT_ON_SEARCH_GROUPS (line 21) | const NO_REDIRECT_ON_SEARCH_GROUPS = Object.freeze(new Set(["a", "c", "f... constant NON_BROWSE_GROUPS (line 22) | const NON_BROWSE_GROUPS = Object.freeze(new Set(["a", "f"])); constant SEARCH_HIDE_TIMEOUT (line 23) | const SEARCH_HIDE_TIMEOUT = 5000; constant COVER_KEYS (line 24) | const COVER_KEYS = Object.freeze(["customCovers", "dynamicCovers", "show... constant DYNAMIC_COVER_KEYS (line 25) | const DYNAMIC_COVER_KEYS = Object.freeze([ constant FILTER_ONLY_KEYS (line 31) | const FILTER_ONLY_KEYS = Object.freeze(["filters", "q"]); constant METADATA_LOAD_KEYS (line 32) | const METADATA_LOAD_KEYS = Object.freeze(["filters", "q", "mtime"]); method groupNames (line 99) | groupNames() { method topGroupChoices (line 107) | topGroupChoices() { method topGroupChoicesMaxLen (line 116) | topGroupChoicesMaxLen() { method orderByChoices (line 119) | orderByChoices(state) { method orderByChoicesMaxLen (line 136) | orderByChoicesMaxLen() { method filterByChoicesMaxLen (line 139) | filterByChoicesMaxLen() { method isAuthorized (line 142) | isAuthorized() { method isDynamicFiltersSelected (line 145) | isDynamicFiltersSelected(state) { method isFiltersClearable (line 153) | isFiltersClearable(state) { method lowestShownGroup (line 159) | lowestShownGroup(state) { method isSearchMode (line 173) | isSearchMode(state) { method lastRoute (line 176) | lastRoute(state) { method coverSettings (line 189) | coverSettings(state) { method filterOnlySettings (line 211) | filterOnlySettings(state) { method metadataSettings (line 214) | metadataSettings(state) { method routeKey (line 217) | routeKey() { method _filterSettings (line 226) | _filterSettings(state, keys) { method _maxLenChoices (line 247) | _maxLenChoices(choices) { method identifierSourceTitle (line 256) | identifierSourceTitle(idSource) { method fixUniverseTitles (line 264) | fixUniverseTitles(universes) { method setIsSearchOpen (line 275) | setIsSearchOpen(value) { method _isRootGroupEnabled (line 281) | _isRootGroupEnabled(topGroup) { method _validateSearch (line 290) | _validateSearch(data) { method _validateTopGroup (line 314) | _validateTopGroup(data, redirect) { method getTopGroup (line 377) | getTopGroup(group) { method _addSettings (line 397) | _addSettings(data) { method _validateAndSaveSettings (line 415) | _validateAndSaveSettings(data) { method setSettings (line 431) | async setSettings(data) { method clearOneFilter (line 441) | async clearOneFilter(filterName) { method clearFilters (line 449) | async clearFilters(clearAll = false) { method setBookmarkFinished (line 467) | async setBookmarkFinished(params, finished) { method clearSearchHideTimeout (line 478) | clearSearchHideTimeout() { method startSearchHideTimeout (line 481) | startSearchHideTimeout() { method setSearchHelpOpen (line 497) | setSearchHelpOpen(value) { method routeToPage (line 504) | routeToPage(page) { method handlePageError (line 509) | handlePageError(error) { method loadSettings (line 528) | async loadSettings() { method loadBrowserPage (line 552) | async loadBrowserPage(mtime, updateSettings = false) { method loadAvailableFilterChoices (line 592) | async loadAvailableFilterChoices() { method loadFilterChoices (line 604) | async loadFilterChoices(fieldName) { method loadMtimes (line 619) | async loadMtimes() { method routeWithSettings (line 637) | routeWithSettings(settings, route) { method loadSavedSettingsList (line 648) | async loadSavedSettingsList() { method saveCurrentSettings (line 661) | async saveCurrentSettings(name) { method loadSavedSettings (line 672) | async loadSavedSettings(pk) { method deleteSavedSettings (line 691) | async deleteSavedSettings(pk) { method clearSavedSettingsSnackbar (line 702) | clearSavedSettingsSnackbar() { FILE: frontend/src/stores/common.js constant ERROR_KEYS (line 6) | const ERROR_KEYS = Object.freeze([ method loadVersions (line 52) | async loadVersions() { method setErrors (line 61) | setErrors(xiorError) { method setSuccess (line 68) | setSuccess(success) { method clearErrors (line 74) | clearErrors() { method setTimestamp (line 80) | setTimestamp() { method setSettingsDrawerOpen (line 83) | setSettingsDrawerOpen(value) { method loadOPDSURLs (line 86) | async loadOPDSURLs() { FILE: frontend/src/stores/metadata.js constant HEAD_ROLES (line 7) | const HEAD_ROLES = Object.freeze([ constant TAGS (line 55) | const TAGS = Object.freeze([ constant MAIN_TAGS (line 67) | const MAIN_TAGS = Object.freeze(new Set(["Characters", "Teams"])); function compareByLastName (line 69) | function compareByLastName(a, b) { method _mappedCredits (line 80) | _mappedCredits(state) { method _sortedRoles (line 102) | _sortedRoles(state) { method credits (line 126) | credits(state) { method identifiers (line 129) | identifiers(state) { method tags (line 154) | tags(state) { method loadMetadata (line 170) | async loadMetadata({ group, pks }) { method clearMetadata (line 183) | clearMetadata() { method getTagName (line 186) | getTagName(key) { method markTagMain (line 202) | markTagMain(tagName, tags) { method mapTag (line 216) | mapTag(tagSource, keys, filter = undefined) { method lazyImport (line 246) | lazyImport({ group, ids }) { FILE: frontend/src/stores/reader.js constant SETTINGS_NULL_VALUES (line 15) | const SETTINGS_NULL_VALUES = Object.freeze(new Set(["", null, undefined])); constant DIRECTION_REVERSE_MAP (line 17) | const DIRECTION_REVERSE_MAP = Object.freeze({ constant PREFETCH_LINK (line 21) | const PREFETCH_LINK = Object.freeze({ rel: "prefetch", as: "image" }); constant VERTICAL_READING_DIRECTIONS (line 22) | const VERTICAL_READING_DIRECTIONS = Object.freeze( constant REVERSE_READING_DIRECTIONS (line 25) | const REVERSE_READING_DIRECTIONS = Object.freeze( constant SCALE_DEFAULT (line 28) | const SCALE_DEFAULT = 1; constant FIT_TO_CLASSES (line 29) | const FIT_TO_CLASSES = Object.freeze({ constant BOOKS_NULL (line 35) | const BOOKS_NULL = Object.freeze({ constant ROUTES_NULL (line 40) | const ROUTES_NULL = Object.freeze({ constant DEFAULT_ARC (line 49) | const DEFAULT_ARC = Object.freeze({ method activeSettings (line 104) | activeSettings(state) { method activeTitle (line 108) | activeTitle(state) { method isVertical (line 123) | isVertical(state) { method isReadInReverse (line 126) | isReadInReverse(state) { method routeParams (line 129) | routeParams(state) { method isPDF (line 132) | isPDF(state) { method cacheBook (line 135) | cacheBook() { method isPagesNotRoutes (line 141) | isPagesNotRoutes(state) { method isBTT (line 144) | isBTT(state) { method isFirstPage (line 147) | isFirstPage(state) { method isLastPage (line 150) | isLastPage(state) { method closeBookRoute (line 156) | closeBookRoute(state) { method setReadRTLInReverse (line 180) | setReadRTLInReverse(bookSettings) { method getBookSettings (line 187) | getBookSettings(book) { method bookChangeLocation (line 224) | bookChangeLocation(direction) { method bookChangeCursorClass (line 233) | bookChangeCursorClass(direction) { method bookChangeShow (line 242) | bookChangeShow(direction) { method bookChangeIcon (line 247) | bookChangeIcon(direction) { method isCoverPage (line 257) | isCoverPage(book, page) { method _getRouteParams (line 263) | _getRouteParams(book, activePage, direction) { method fitToClass (line 286) | fitToClass(bookSettings) { method _applyGlobalSettings (line 308) | _applyGlobalSettings(updates) { method toggleToolbars (line 319) | toggleToolbars() { method setShowToolbars (line 322) | setShowToolbars() { method reset (line 325) | reset() { method _getBookRoutePage (line 342) | _getBookRoutePage(book, isPrev) { method _getBookRoute (line 355) | _getBookRoute(book, isPrev) { method _getBookRoutes (line 365) | _getBookRoutes(prevBook, nextBook) { method setRoutesAndBookmarkPage (line 371) | async setRoutesAndBookmarkPage(page) { method setActivePage (line 382) | setActivePage(page, reactWithScroll = true) { method loadGlobalSettings (line 403) | async loadGlobalSettings() { method loadBooks (line 413) | async loadBooks({ params, arc, mtime }) { method loadMtimes (line 476) | async loadMtimes() { method _setBookmarkPage (line 498) | async _setBookmarkPage(page) { method updateComicSettings (line 510) | async updateComicSettings(updates) { method setSettingsClient (line 529) | setSettingsClient(updates) { method clearComicSettings (line 535) | async clearComicSettings() { method _getStoryArcPk (line 549) | _getStoryArcPk() { method loadAllSettings (line 556) | async loadAllSettings(pk) { method updateIntermediateSettings (line 596) | async updateIntermediateSettings(updates) { method clearIntermediateSettings (line 619) | async clearIntermediateSettings() { method clearGlobalSettings (line 633) | async clearGlobalSettings() { method updateGlobalSettings (line 642) | async updateGlobalSettings(updates) { method setBookChangeFlag (line 659) | setBookChangeFlag(direction) { method linkLabel (line 663) | linkLabel(direction, suffix) { method normalizeDirection (line 670) | normalizeDirection(direction) { method _validateRoute (line 675) | _validateRoute(params, book) { method _routeTo (line 692) | _routeTo(params, book) { method routeToDirectionOne (line 701) | routeToDirectionOne(direction) { method routeToDirection (line 715) | routeToDirection(direction) { method routeToPage (line 731) | routeToPage(page) { method routeToBook (line 735) | routeToBook(direction) { method toRoute (line 738) | toRoute(params) { method _prefetchSrc (line 742) | _prefetchSrc(params, direction, bookChange = false, secondPage = false) { method prefetchLinks (line 764) | prefetchLinks(params, direction, bookChange = false) { method prefetchBook (line 780) | prefetchBook(book) { FILE: frontend/src/stores/socket.js constant USER_GROUP_ROUTES (line 13) | const USER_GROUP_ROUTES = Object.freeze([ constant HEARTBEAT_INTERVAL_MS (line 19) | const HEARTBEAT_INTERVAL_MS = 5_000; constant RECONNECT_RETRIES (line 20) | const RECONNECT_RETRIES = Infinity; constant RECONNECT_DELAY_MS (line 21) | const RECONNECT_DELAY_MS = 3_000; function currentRouteName (line 24) | function currentRouteName() { function startHeartbeat (line 34) | function startHeartbeat(ws) { function stopHeartbeat (line 43) | function stopHeartbeat() { method onFailed (line 54) | onFailed() { method onConnected (line 58) | onConnected(ws) { method onMessage (line 62) | onMessage(_ws, event) { method onError (line 65) | onError(ws, event) { method onDisconnected (line 68) | onDisconnected(_ws, event) { function getAdminStore (line 81) | async function getAdminStore() { function adminLoadTables (line 90) | async function adminLoadTables(tables) { function adminLoadAllStatuses (line 95) | async function adminLoadAllStatuses() { function reloadBrowser (line 100) | function reloadBrowser() { function adminFlagsNotified (line 106) | function adminFlagsNotified() { function groupsNotified (line 113) | function groupsNotified() { function usersNotified (line 119) | function usersNotified() { function libraryNotified (line 125) | async function libraryNotified() { function failedImportsNotified (line 145) | async function failedImportsNotified() { function dispatchMessage (line 152) | function dispatchMessage(message) { function useSocketStoreWithOut (line 199) | function useSocketStoreWithOut() { FILE: frontend/src/stores/store.js function setupStore (line 4) | function setupStore(app) { FILE: frontend/tests/unit/reader-nav-button.test.js constant BTN_DISABLED (line 11) | const BTN_DISABLED = "v-btn--disabled"; FILE: frontend/vite.config.js constant STATIC_DIR_NAME (line 23) | const STATIC_DIR_NAME = "static"; constant BASE_PATH (line 24) | const BASE_PATH = `${rootPath}/${STATIC_DIR_NAME}/`; constant IS_TEST_ENV (line 25) | const IS_TEST_ENV = process.env.NODE_ENV === "test"; FILE: mock_comics/bigbook.py function create_number_images (line 16) | def create_number_images(output_dir: str, num_files: int): function main (line 46) | def main(): FILE: mock_comics/mock_comics.py function _get_all_language_codes (line 87) | def _get_all_language_codes(): function is_valid (line 108) | def is_valid(): function rand_string (line 116) | def rand_string(length, choices=CHOICES_STR): function rand_digits (line 121) | def rand_digits(length): function create_int (line 126) | def create_int(md, key, limit): function create_float (line 139) | def create_float(md, key, limit): function create_str (line 148) | def create_str(md, key, limit): function create_web (line 157) | def create_web(md, key, _limit): function create_lang (line 183) | def create_lang(md, key, _limit): function create_name_list (line 189) | def create_name_list(md, key): function create_bool (line 201) | def create_bool(md, key): function create_manga (line 210) | def create_manga(md): function create_credits (line 219) | def create_credits(md): function create_metadata (line 230) | def create_metadata(): function create_cover_page (line 267) | def create_cover_page(): function create_test_file (line 278) | def create_test_file(path): function _hex_path (line 289) | def _hex_path(num): function create_file (line 299) | def create_file(root, index): function main (line 306) | def main(args): FILE: tests/importer/test_basic.py function create_fts_strings (line 667) | def create_fts_strings(md, pk): function create_compare_comic_values (line 687) | def create_compare_comic_values(agg_md): function write_out (line 709) | def write_out(old_md, new_md): function diff_assert (line 715) | def diff_assert(old_md: Mapping, new_md: Mapping, phase: str): function _test_comic_creation_field_protagonist (line 726) | def _test_comic_creation_field_protagonist(comic, field_name, test_value): function _test_comic_creation_field_complex (line 737) | def _test_comic_creation_field_complex(field_name: str, value): function _test_comic_creation_field (line 756) | def _test_comic_creation_field(comic, field_name, test_value): function export_test_comic_creation (line 774) | def export_test_comic_creation(values_const: MappingProxyType): function export_test_fts_creation (line 788) | def export_test_fts_creation(values_const: MappingProxyType, comic: Comic): class BaseTestImporter (line 798) | class BaseTestImporter(SerializeMixin, TestCase, ABC): method setUpTestData (line 803) | def setUpTestData(cls): method tearDownClass (line 812) | def tearDownClass(cls): method setUp (line 816) | def setUp(self): method tearDown (line 826) | def tearDown(self): class TestImporterBasic (line 831) | class TestImporterBasic(BaseTestImporter): method test_import (line 832) | def test_import(self): FILE: tests/importer/test_update_all.py class TestImporterUpdateAll (line 718) | class TestImporterUpdateAll(BaseTestImporterUpdate): method setUp (line 720) | def setUp(self): method test_update_all (line 724) | def test_update_all(self): FILE: tests/importer/test_update_none.py class BaseTestImporterUpdate (line 108) | class BaseTestImporterUpdate(BaseTestImporter, ABC): method setUp (line 110) | def setUp(self): class TestImporterUpdateNone (line 121) | class TestImporterUpdateNone(BaseTestImporterUpdate): method test_update_none (line 122) | def test_update_none(self): FILE: tests/test_asgi.py class EnvironTestCase (line 8) | class EnvironTestCase(TestCase): method receive (line 11) | def receive(self): method send (line 14) | def send(self): method test_application (line 17) | async def test_application(self): FILE: tests/test_models.py class ComicTestCase (line 15) | class ComicTestCase(TestCase): method setUp (line 27) | def setUp(self): method tearDown (line 56) | def tearDown(self): method test_comic_save (line 60) | def test_comic_save(self):