Перейти к содержанию

Модели данных

Pydantic-модели для работы с данными.

FileStatus

FileStatus

Bases: BaseModel

Статус файла при синхронизации.

Source code in src/sandboxer/wiki_sync/core/models.py
class FileStatus(BaseModel):
    """Статус файла при синхронизации."""

    slug: str
    file_path: Path
    status: SyncStatus
    title: str = ""
    wiki_modified: datetime | None = None
    error_message: str | None = None

SyncResult

SyncResult

Bases: BaseModel

Результат синхронизации.

Source code in src/sandboxer/wiki_sync/core/models.py
class SyncResult(BaseModel):
    """Результат синхронизации."""

    synced: list[FileStatus] = Field(default_factory=list)
    modified: list[FileStatus] = Field(default_factory=list)
    new: list[FileStatus] = Field(default_factory=list)
    conflict: list[FileStatus] = Field(default_factory=list)
    remote_modified: list[FileStatus] = Field(default_factory=list)
    deleted_local: list[FileStatus] = Field(default_factory=list)
    errors: list[FileStatus] = Field(default_factory=list)

    @property
    def total_files(self) -> int:
        """Общее количество файлов."""
        return len(self.synced) + len(self.modified) + len(self.new) + len(self.conflict) + len(self.remote_modified)

    @property
    def has_changes(self) -> bool:
        """Есть ли изменения для синхронизации."""
        return bool(self.modified or self.new or self.conflict or self.remote_modified or self.deleted_local)

    @property
    def has_conflicts(self) -> bool:
        """Есть ли конфликты."""
        return bool(self.conflict)

    @property
    def uploadable_files(self) -> list[FileStatus]:
        """Файлы, которые можно загрузить в Wiki."""
        return self.modified + self.new

total_files property

total_files

Общее количество файлов.

has_changes property

has_changes

Есть ли изменения для синхронизации.

has_conflicts property

has_conflicts

Есть ли конфликты.

uploadable_files property

uploadable_files

Файлы, которые можно загрузить в Wiki.

PageInfo

PageInfo

Bases: BaseModel

Информация о странице Wiki.

Source code in src/sandboxer/wiki_sync/core/models.py
class PageInfo(BaseModel):
    """Информация о странице Wiki."""

    id: int
    slug: str
    title: str
    page_type: str = "wysiwyg"

PageContent

PageContent

Bases: BaseModel

Контент страницы Wiki.

Source code in src/sandboxer/wiki_sync/core/models.py
class PageContent(BaseModel):
    """Контент страницы Wiki."""

    id: int
    slug: str
    title: str
    content: str = ""
    modified_at: datetime | None = None

PageMeta

PageMeta

Bases: BaseModel

Метаданные страницы для локального хранения.

Source code in src/sandboxer/wiki_sync/core/models.py
class PageMeta(BaseModel):
    """Метаданные страницы для локального хранения."""

    id: int
    slug: str
    title: str
    file: str  # Относительный путь к файлу
    content_hash: str
    last_push: datetime | None = None
    last_pull: datetime | None = None

MetaStorage

MetaStorage

Bases: BaseModel

Хранилище метаданных (.wiki-meta.json).

Source code in src/sandboxer/wiki_sync/core/models.py
class MetaStorage(BaseModel):
    """Хранилище метаданных (.wiki-meta.json)."""

    version: int = 1
    pages: dict[str, PageMeta] = Field(default_factory=dict)

    def get_page(self, slug: str) -> PageMeta | None:
        """Получить метаданные страницы по slug."""
        return self.pages.get(slug)

    def set_page(self, slug: str, meta: PageMeta) -> None:
        """Установить метаданные страницы."""
        self.pages[slug] = meta

    def remove_page(self, slug: str) -> bool:
        """Удалить метаданные страницы."""
        if slug in self.pages:
            del self.pages[slug]
            return True
        return False

get_page

get_page(slug)

Получить метаданные страницы по slug.

Source code in src/sandboxer/wiki_sync/core/models.py
def get_page(self, slug: str) -> PageMeta | None:
    """Получить метаданные страницы по slug."""
    return self.pages.get(slug)

set_page

set_page(slug, meta)

Установить метаданные страницы.

Source code in src/sandboxer/wiki_sync/core/models.py
def set_page(self, slug: str, meta: PageMeta) -> None:
    """Установить метаданные страницы."""
    self.pages[slug] = meta

remove_page

remove_page(slug)

Удалить метаданные страницы.

Source code in src/sandboxer/wiki_sync/core/models.py
def remove_page(self, slug: str) -> bool:
    """Удалить метаданные страницы."""
    if slug in self.pages:
        del self.pages[slug]
        return True
    return False