Coverage for src/paperap/models/tag/model.py: 96%
27 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-11 21:37 -0400
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-11 21:37 -0400
1"""
2----------------------------------------------------------------------------
4 METADATA:
6 File: tag.py
7 Project: paperap
8 Created: 2025-03-04
9 Version: 0.0.5
10 Author: Jess Mann
11 Email: jess@jmann.me
12 Copyright (c) 2025 Jess Mann
14----------------------------------------------------------------------------
16 LAST MODIFIED:
18 2025-03-04 By Jess Mann
20"""
22from __future__ import annotations
24from datetime import datetime
25from typing import TYPE_CHECKING, Any, Optional
27from pydantic import Field, field_validator
29from paperap.models.abstract.model import StandardModel
30from paperap.models.mixins.models import MatcherMixin
31from paperap.models.tag.queryset import TagQuerySet
33if TYPE_CHECKING:
34 from paperap.models.document import Document, DocumentQuerySet
37class Tag(StandardModel, MatcherMixin):
38 """
39 Represents a tag in Paperless-NgX.
40 """
42 name: str | None = None
43 slug: str | None = None
44 colour: str | None = Field(alias="color", default=None)
45 is_inbox_tag: bool | None = None
46 document_count: int = 0
47 owner: int | None = None
48 user_can_change: bool | None = None
50 class Meta(StandardModel.Meta):
51 # Fields that should not be modified
52 read_only_fields = {"slug", "document_count"}
53 queryset = TagQuerySet
55 @field_validator("colour", mode="before")
56 @classmethod
57 def validate_colour(cls, value: str | int | None) -> str | None:
58 if value is None:
59 return None
60 return str(value)
62 @property
63 def documents(self) -> "DocumentQuerySet":
64 """
65 Get documents with this tag.
67 Returns:
68 List of documents.
70 """
71 return self._client.documents().all().tag_id(self.id)