diff --git a/.mypy-baseline.txt b/.mypy-baseline.txt index 2a560ebf1..53cd76c5a 100644 --- a/.mypy-baseline.txt +++ b/.mypy-baseline.txt @@ -129,8 +129,10 @@ src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attr src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attribute "original_filename" [union-attr] src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attribute "pk" [union-attr] src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attribute "pk" [union-attr] +src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attribute "pk" [union-attr] src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] src/documents/consumer.py:0: error: List item 2 has incompatible type "Path"; expected "str" [list-item] +src/documents/consumer.py:0: error: Return type "ConsumeFileSuccessResult" of "run" incompatible with return type "str | None" in supertype "documents.plugins.base.ConsumeTaskPlugin" [override] src/documents/consumer.py:0: error: Too many arguments for "__init__" of "object" [call-arg] src/documents/context_processors.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/converters.py:0: error: List item 3 has incompatible type "Path"; expected "str" [list-item] @@ -176,6 +178,9 @@ src/documents/filters.py:0: error: Function is missing a type annotation [no-un src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -190,6 +195,7 @@ src/documents/filters.py:0: error: Incompatible types in assignment (expression src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "ListField", variable has type "BooleanField | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "ListField", variable has type "BooleanField | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "ListField", variable has type "BooleanField | None") [assignment] +src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "MonetaryAmountField", variable has type "BooleanField | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "SelectField", variable has type "BooleanField | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "Sum", variable has type "Subquery | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "list[str]") [assignment] @@ -197,6 +203,7 @@ src/documents/filters.py:0: error: Item "None" of "Any | None" has no attribute src/documents/filters.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/documents/filters.py:0: error: Item "None" of "BooleanField | None" has no attribute "allow_null" [union-attr] src/documents/filters.py:0: error: Missing type arguments for generic type "Callable" [type-arg] +src/documents/filters.py:0: error: Missing type arguments for generic type "Field" [type-arg] src/documents/filters.py:0: error: Need type annotation for "_annotations" (hint: "_annotations: dict[, ] = ...") [var-annotated] src/documents/filters.py:0: error: Need type annotation for "_model_serializer" [var-annotated] src/documents/filters.py:0: error: Skipping analyzing "rest_framework_guardian.filters": module is installed, but missing library stubs or py.typed marker [import-untyped] @@ -224,8 +231,6 @@ src/documents/management/commands/document_exporter.py:0: error: Function is mis src/documents/management/commands/document_exporter.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/management/commands/document_exporter.py:0: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "None") [assignment] src/documents/management/commands/document_exporter.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "Path") [assignment] -src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] -src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] @@ -239,6 +244,8 @@ src/documents/management/commands/document_exporter.py:0: error: Missing type ar src/documents/management/commands/document_exporter.py:0: error: Skipping analyzing "allauth.mfa.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/management/commands/document_exporter.py:0: error: Skipping analyzing "allauth.socialaccount.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/management/commands/document_exporter.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/management/commands/document_fuzzy_match.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/management/commands/document_fuzzy_match.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/management/commands/document_fuzzy_match.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/management/commands/document_fuzzy_match.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/management/commands/document_importer.py:0: error: Argument 1 to "create_source_path_directory" has incompatible type "Path | None"; expected "Path" [arg-type] @@ -388,7 +395,6 @@ src/documents/permissions.py:0: error: Function is missing a type annotation for src/documents/permissions.py:0: error: Item "list[str]" of "Any | list[str] | QuerySet[User, User]" has no attribute "exclude" [union-attr] src/documents/permissions.py:0: error: Item "list[str]" of "Any | list[str] | QuerySet[User, User]" has no attribute "exists" [union-attr] src/documents/permissions.py:0: error: Item "list[str]" of "Any | list[str] | QuerySet[User, User]" has no attribute "exists" [union-attr] -src/documents/permissions.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] src/documents/permissions.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/plugins/date_parsing/regex_parser.py:0: error: Library stubs not installed for "regex" [import-untyped] src/documents/plugins/helpers.py:0: error: Skipping analyzing "channels_redis.pubsub": module is installed, but missing library stubs or py.typed marker [import-untyped] @@ -396,7 +402,7 @@ src/documents/regex.py:0: error: Function is missing a return type annotation [ src/documents/regex.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/regex.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/regex.py:0: error: Library stubs not installed for "regex" [import-untyped] -src/documents/sanity_checker.py:0: error: Incompatible type for "task_id" of "PaperlessTask" (got "UUID", expected "str | int | Combinable") [misc] +src/documents/sanity_checker.py:0: error: Unused "type: ignore" comment [unused-ignore] src/documents/schema.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/schema.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/schema.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -405,21 +411,26 @@ src/documents/search/_backend.py:0: error: "None" has no attribute "acquire" [a src/documents/search/_backend.py:0: error: "None" has no attribute "add_document" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "commit" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "delete_documents_by_query" [attr-defined] +src/documents/search/_backend.py:0: error: "None" has no attribute "parse_query" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "reload" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "schema" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] +src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "writer" [attr-defined] src/documents/search/_backend.py:0: error: Argument 1 to "build_permission_filter" has incompatible type "None"; expected "Schema" [arg-type] src/documents/search/_backend.py:0: error: Argument 1 to "build_permission_filter" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "build_permission_filter" has incompatible type "None"; expected "Schema" [arg-type] +src/documents/search/_backend.py:0: error: Argument 1 to "parse_simple_text_highlight_query" has incompatible type "None"; expected "Index" [arg-type] src/documents/search/_backend.py:0: error: Argument 1 to "parse_simple_text_query" has incompatible type "None"; expected "Index" [arg-type] src/documents/search/_backend.py:0: error: Argument 1 to "parse_simple_title_query" has incompatible type "None"; expected "Index" [arg-type] src/documents/search/_backend.py:0: error: Argument 1 to "parse_user_query" has incompatible type "None"; expected "Index" [arg-type] src/documents/search/_backend.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] src/documents/search/_backend.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] +src/documents/search/_backend.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] +src/documents/search/_backend.py:0: error: Argument 1 to "regex_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] src/documents/search/_backend.py:0: error: Argument 1 to "register_tokenizers" has incompatible type "None"; expected "Index" [arg-type] +src/documents/search/_backend.py:0: error: Argument 1 to "term_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] src/documents/search/_backend.py:0: error: Argument 2 to "add_unsigned" of "Document" has incompatible type "int | None"; expected "int" [arg-type] src/documents/search/_backend.py:0: error: Argument 2 to "add_unsigned" of "Document" has incompatible type "int | None"; expected "int" [arg-type] src/documents/search/_backend.py:0: error: Argument 2 to "add_unsigned" of "Document" has incompatible type "int | None"; expected "int" [arg-type] @@ -433,6 +444,11 @@ src/documents/search/_backend.py:0: error: Incompatible types in assignment (exp src/documents/search/_backend.py:0: error: Incompatible types in assignment (expression has type "SoftFileLock", variable has type "None") [assignment] src/documents/search/_backend.py:0: error: Item "str" of "Any | str" has no attribute "pk" [union-attr] src/documents/search/_backend.py:0: error: Library stubs not installed for "regex" [import-untyped] +src/documents/search/_backend.py:0: error: List comprehension has incompatible type List[tuple[Any, Any]]; expected List[tuple[Any]] [misc] +src/documents/search/_backend.py:0: error: List comprehension has incompatible type List[tuple[Any, Any]]; expected List[tuple[Any]] [misc] +src/documents/search/_backend.py:0: error: Tuple index out of range [misc] +src/documents/search/_backend.py:0: error: Tuple index out of range [misc] +src/documents/search/_backend.py:0: error: Tuple index out of range [misc] src/documents/search/_query.py:0: error: Argument 3 to "regex_phrase_query" of "Query" has incompatible type "list[str]"; expected "list[str | tuple[int, str]]" [arg-type] src/documents/search/_query.py:0: error: Library stubs not installed for "regex" [import-untyped] src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] @@ -441,8 +457,10 @@ src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" src/documents/serialisers.py:0: error: Argument "choices" to "ChoiceField" has incompatible type "type[FieldDataType]"; expected "Sequence[Any]" [arg-type] src/documents/serialisers.py:0: error: Argument "default" to "MultipleChoiceField" has incompatible type "set[DocumentSource]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" [arg-type] src/documents/serialisers.py:0: error: Argument 1 of "get_value" is incompatible with supertype "rest_framework.fields.Field"; supertype defines the argument type as "Mapping[Any, Any]" [override] +src/documents/serialisers.py:0: error: Argument 1 of "update" is incompatible with supertype "rest_framework.serializers.BaseSerializer"; supertype defines the argument type as "dict[str, Any]" [override] src/documents/serialisers.py:0: error: Argument 1 to "get_value_field_name" of "CustomFieldInstance" has incompatible type "str"; expected "FieldDataType" [arg-type] -src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/documents/serialisers.py:0: error: Argument 1 to "list" has incompatible type "QuerySet[Document, TypedDict({'id': int, 'title': str, 'deleted_at': datetime | None})]"; expected "Iterable[dict[str, Any]]" [arg-type] src/documents/serialisers.py:0: error: Expected iterable as variadic argument [misc] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -518,7 +536,6 @@ src/documents/serialisers.py:0: error: Function is missing a type annotation [n src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -557,9 +574,8 @@ src/documents/serialisers.py:0: error: Function is missing a type annotation for src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/serialisers.py:0: error: Incompatible type for lookup 'pk': (got "str | None", expected "str | int") [misc] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "PrimaryKeyRelatedField[Tag]", base class "Field" defined the type as "BaseSerializer[Any]") [assignment] +src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "UnknownQuerySet[Document, Document]") [assignment] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "Sequence[str] | tuple[Lower]", variable has type "Sequence[str] | None") [assignment] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "WorkflowActionWebhookSerializer", variable has type "WorkflowActionEmailSerializer") [assignment] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[Correspondent]", variable has type "type[Tag] | None") [assignment] @@ -578,23 +594,19 @@ src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "fetch_documents" [union-attr] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] -src/documents/serialisers.py:0: error: Item "None" of "Match[str] | None" has no attribute "group" [union-attr] src/documents/serialisers.py:0: error: Item "None" of "ObjectPermissionChecker | None" has no attribute "has_perm" [union-attr] src/documents/serialisers.py:0: error: Item "list[str]" of "Any | list[str]" has no attribute "values_list" [union-attr] src/documents/serialisers.py:0: error: Missing type arguments for generic type "Field" [type-arg] src/documents/serialisers.py:0: error: Missing type arguments for generic type "Iterable" [type-arg] -src/documents/serialisers.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] -src/documents/serialisers.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] -src/documents/serialisers.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] -src/documents/serialisers.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] -src/documents/serialisers.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] -src/documents/serialisers.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] -src/documents/serialisers.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] src/documents/serialisers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/serialisers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/serialisers.py:0: error: Need type annotation for "document" [var-annotated] src/documents/serialisers.py:0: error: Need type annotation for "documents" [var-annotated] src/documents/serialisers.py:0: error: Need type annotation for "permissions_dict" [var-annotated] +src/documents/serialisers.py:0: error: Need type annotation for "with_perms" [var-annotated] +src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] +src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] +src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] src/documents/serialisers.py:0: error: Skipping analyzing "auditlog.context": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/serialisers.py:0: error: Value of type "Any | None" is not indexable [index] src/documents/serialisers.py:0: error: Value of type "Any | None" is not indexable [index] @@ -632,12 +644,12 @@ src/documents/signals/handlers.py:0: error: Function is missing a type annotatio src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/signals/handlers.py:0: error: Incompatible types in assignment (expression has type "Any | None", target has type "datetime") [assignment] src/documents/signals/handlers.py:0: error: Incompatible types in assignment (expression has type "str", target has type "datetime") [assignment] src/documents/signals/handlers.py:0: error: Incompatible types in assignment (expression has type "tuple[Any, Any, Any]", variable has type "tuple[Any, Any]") [assignment] src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "save" [union-attr] src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "source_path" [union-attr] -src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "tags" [union-attr] src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "title" [union-attr] src/documents/signals/handlers.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/documents/signals/handlers.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] @@ -646,6 +658,13 @@ src/documents/signals/handlers.py:0: error: Item "None" of "Path | Any | None" h src/documents/signals/handlers.py:0: error: Item "None" of "Path | Any | None" has no attribute "is_file" [union-attr] src/documents/signals/handlers.py:0: error: Item "None" of "Path | Any | None" has no attribute "is_file" [union-attr] src/documents/signals/handlers.py:0: error: Missing return statement [return] +src/documents/signals/handlers.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/signals/handlers.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/signals/handlers.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/signals/handlers.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/signals/handlers.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/signals/handlers.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/signals/handlers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/signals/handlers.py:0: error: Unsupported right operand type for in ("Any | None") [operator] src/documents/signals/handlers.py:0: error: Unsupported target for indexed assignment ("Any | None") [index] src/documents/signals/handlers.py:0: error: Value of type variable "_StrPathT" of "move" cannot be "Path | Any | None" [type-var] @@ -655,17 +674,12 @@ src/documents/tasks.py:0: error: Argument 1 to "create_source_path_directory" ha src/documents/tasks.py:0: error: Argument 1 to "move" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tasks.py:0: error: Argument 4 to "ConsumeTaskPlugin" has incompatible type "str"; expected "Path" [arg-type] src/documents/tasks.py:0: error: Argument 5 to "ConsumeTaskPlugin" has incompatible type "str | None"; expected "str" [arg-type] -src/documents/tasks.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tasks.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tasks.py:0: error: Incompatible type for "task_id" of "PaperlessTask" (got "UUID", expected "str | int | Combinable") [misc] -src/documents/tasks.py:0: error: Incompatible type for "task_id" of "PaperlessTask" (got "UUID", expected "str | int | Combinable") [misc] +src/documents/tasks.py:0: error: Incompatible return value type (got "str | None", expected "ConsumeFileSuccessResult | ConsumeFileStoppedResult | ConsumeFileDuplicateResult | None") [return-value] src/documents/tasks.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "str") [assignment] src/documents/tasks.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Document, Document]", variable has type "UnknownQuerySet[Document, Document]") [assignment] src/documents/tasks.py:0: error: Missing type arguments for generic type "Task" [type-arg] @@ -686,45 +700,16 @@ src/documents/templating/filters.py:0: error: Incompatible types in assignment ( src/documents/templating/filters.py:0: error: Item "str" of "str | datetime" has no attribute "strftime" [union-attr] src/documents/templating/utils.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/templating/workflows.py:0: error: Incompatible return value type (got "None", expected "str") [return-value] -src/documents/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/conftest.py:0: error: "type[UserModelT?]" has no attribute "objects" [attr-defined] src/documents/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/conftest.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/conftest.py:0: error: Incompatible return value type (got "DocumentFactory", expected "Document") [return-value] -src/documents/tests/factories.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] -src/documents/tests/factories.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] -src/documents/tests/factories.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] -src/documents/tests/factories.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] -src/documents/tests/factories.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] +src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] +src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] +src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -749,7 +734,6 @@ src/documents/tests/management/test_management_base_cmd.py:0: error: Incompatibl src/documents/tests/management/test_management_base_cmd.py:0: error: Incompatible types in assignment (expression has type "StringIO", variable has type "OutputWrapper") [assignment] src/documents/tests/management/test_management_base_cmd.py:0: error: Incompatible types in assignment (expression has type "StringIO", variable has type "OutputWrapper") [assignment] src/documents/tests/management/test_management_base_cmd.py:0: error: Incompatible types in assignment (expression has type "StringIO", variable has type "OutputWrapper") [assignment] -src/documents/tests/management/test_management_base_cmd.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] src/documents/tests/management/test_management_base_cmd.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/tests/management/test_management_base_cmd.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/tests/management/test_management_base_cmd.py:0: error: Missing type arguments for generic type "dict" [type-arg] @@ -763,48 +747,11 @@ src/documents/tests/management/test_management_base_cmd.py:0: error: Need type a src/documents/tests/management/test_management_sanity_checker.py:0: error: "DocumentFactory" has no attribute "source_path"; maybe "storage_path"? [attr-defined] src/documents/tests/management/test_management_sanity_checker.py:0: error: "DocumentFactory" has no attribute "thumbnail_path" [attr-defined] src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] @@ -828,34 +775,12 @@ src/documents/tests/test_admin.py:0: error: "PaperlessUserForm" has no attribute src/documents/tests/test_admin.py:0: error: "PaperlessUserForm" has no attribute "request" [attr-defined] src/documents/tests/test_admin.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] src/documents/tests/test_admin.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_admin.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_admin.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] src/documents/tests/test_api_app_config.py:0: error: "ImageFile" has no attribute "text" [attr-defined] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "ai_enabled" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_title" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_title" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "barcode_tag_mapping" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "color_conversion_strategy" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "language" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_api_key" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_api_key" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_api_key" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_embedding_backend" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "refresh_from_db" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "refresh_from_db" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/documents/tests/test_api_app_config.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "user_args" [union-attr] src/documents/tests/test_api_bulk_download.py:0: error: Value of type variable "_StrPathT" of "copy" cannot be "Path | None" [type-var] src/documents/tests/test_api_bulk_edit.py:0: error: "type[MatchingModel]" has no attribute "objects" [attr-defined] src/documents/tests/test_api_bulk_edit.py:0: error: "type[MatchingModel]" has no attribute "objects" [attr-defined] -src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -893,21 +818,6 @@ src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type a src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_bulk_edit.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/tests/test_api_custom_fields.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_api_custom_fields.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] src/documents/tests/test_api_documents.py:0: error: "None" object is not iterable [misc] src/documents/tests/test_api_documents.py:0: error: "object" has no attribute "get" [attr-defined] src/documents/tests/test_api_documents.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] @@ -916,10 +826,8 @@ src/documents/tests/test_api_documents.py:0: error: Argument 1 to "assertCountEq src/documents/tests/test_api_documents.py:0: error: Argument 2 to "assertNotIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_api_documents.py:0: error: Argument 2 to "assertNotIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_api_documents.py:0: error: Argument 3 to "generic" of "APIClient" has incompatible type "bytes"; expected "str" [arg-type] -src/documents/tests/test_api_documents.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_api_documents.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_documents.py:0: error: Item "None" of "SavedViewFilterRule | None" has no attribute "value" [union-attr] @@ -933,6 +841,7 @@ src/documents/tests/test_api_documents.py:0: error: Value of type variable "_Str src/documents/tests/test_api_email.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_email.py:0: error: Item "None" of "Path | None" has no attribute "stat" [union-attr] src/documents/tests/test_api_email.py:0: error: Value of type variable "_StrPathT" of "copy" cannot be "Path | None" [type-var] +src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Argument 1 to "quote" has incompatible type "str | None"; expected "str" [arg-type] src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -945,7 +854,6 @@ src/documents/tests/test_api_objects.py:0: error: Function is missing a type ann src/documents/tests/test_api_permissions.py:0: error: Argument 2 to "get_perms" has incompatible type "Tag | None"; expected "Model" [arg-type] src/documents/tests/test_api_permissions.py:0: error: Argument 2 to "get_perms" has incompatible type "Tag | None"; expected "Model" [arg-type] src/documents/tests/test_api_permissions.py:0: error: Argument 2 to "has_perm" of "ObjectPermissionChecker" has incompatible type "Tag | None"; expected "Model" [arg-type] -src/documents/tests/test_api_permissions.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_api_permissions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_permissions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_permissions.py:0: error: Item "None" of "Tag | None" has no attribute "owner" [union-attr] @@ -969,44 +877,58 @@ src/documents/tests/test_api_profile.py:0: error: Function is missing a type ann src/documents/tests/test_api_profile.py:0: error: Item "None" of "Token | None" has no attribute "key" [union-attr] src/documents/tests/test_api_profile.py:0: error: Skipping analyzing "allauth.mfa.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/tests/test_api_profile.py:0: error: Skipping analyzing "allauth.socialaccount.models": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/documents/tests/test_api_search.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_api_schema.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_api_schema.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_api_schema.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_schema.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Need type annotation for "seen_ids" (hint: "seen_ids: list[] = ...") [var-annotated] +src/documents/tests/test_api_search.py:0: error: Unsupported left operand type for < ("None") [operator] +src/documents/tests/test_api_search.py:0: error: Unsupported operand types for < ("int" and "None") [operator] +src/documents/tests/test_api_search.py:0: error: Unsupported operand types for > ("int" and "None") [operator] +src/documents/tests/test_api_search.py:0: error: Value of type variable "SupportsRichComparisonT" of "max" cannot be "int | None" [type-var] +src/documents/tests/test_api_search.py:0: error: Value of type variable "SupportsRichComparisonT" of "min" cannot be "int | None" [type-var] src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "pk" [attr-defined] +src/documents/tests/test_api_tasks.py:0: error: Argument 2 to "get" of "APIClient" has incompatible type "dict[str, Faker]"; expected "Mapping[str, str | bytes | float | Iterable[str | bytes | float]] | Iterable[tuple[str, str | bytes | float | Iterable[str | bytes | float]]] | None" [arg-type] +src/documents/tests/test_api_tasks.py:0: error: Argument 3 to "assign_perm" has incompatible type "DocumentFactory"; expected "Model | None" [arg-type] +src/documents/tests/test_api_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_uisettings.py:0: error: Argument 1 to "assertDictEqual" of "TestCase" has incompatible type "Any | None"; expected "Mapping[Any, object]" [arg-type] -src/documents/tests/test_api_workflows.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_api_workflows.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_api_workflows.py:0: error: Item "None" of "Correspondent | None" has no attribute "pk" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowAction | None" has no attribute "assign_title" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowAction | None" has no attribute "id" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_custom_field_query" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_custom_field_query" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_all_tags" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_all_tags" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_any_correspondents" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_any_correspondents" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_any_document_types" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_any_document_types" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_any_storage_paths" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_any_storage_paths" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_correspondents" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_correspondents" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_document_types" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_document_types" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_storage_paths" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_storage_paths" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_tags" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_not_tags" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_tags" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "filter_has_tags" [union-attr] -src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowTrigger | None" has no attribute "id" [union-attr] src/documents/tests/test_barcodes.py:0: error: "GetReaderPluginMixin" has no attribute "dirs" [attr-defined] src/documents/tests/test_barcodes.py:0: error: Argument 1 to "contextmanager" has incompatible type "Callable[[TestAsnBarcode, Path], BarcodePlugin]"; expected "Callable[[TestAsnBarcode, Path], Iterator[Never]]" [arg-type] src/documents/tests/test_barcodes.py:0: error: Argument 1 to "contextmanager" has incompatible type "Callable[[TestTagBarcode, Path], BarcodePlugin]"; expected "Callable[[TestTagBarcode, Path], Iterator[Never]]" [arg-type] @@ -1014,14 +936,7 @@ src/documents/tests/test_barcodes.py:0: error: Argument 1 to "get_reader" of "Ge src/documents/tests/test_barcodes.py:0: error: Argument 3 to "BarcodePlugin" has incompatible type "DummyProgressManager"; expected "ProgressManager" [arg-type] src/documents/tests/test_barcodes.py:0: error: Argument 3 to "BarcodePlugin" has incompatible type "DummyProgressManager"; expected "ProgressManager" [arg-type] src/documents/tests/test_barcodes.py:0: error: Argument 3 to "BarcodePlugin" has incompatible type "DummyProgressManager"; expected "ProgressManager" [arg-type] -src/documents/tests/test_barcodes.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_barcodes.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "str") [assignment] -src/documents/tests/test_barcodes.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "barcode_string" [union-attr] -src/documents/tests/test_barcodes.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "barcodes_enabled" [union-attr] -src/documents/tests/test_barcodes.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/documents/tests/test_barcodes.py:0: error: Item "None" of "Document | None" has no attribute "archive_serial_number" [union-attr] -src/documents/tests/test_barcodes.py:0: error: Item "None" of "Tag | None" has no attribute "name" [union-attr] -src/documents/tests/test_barcodes.py:0: error: Item "None" of "Tag | None" has no attribute "name" [union-attr] src/documents/tests/test_barcodes.py:0: error: Need type annotation for "reader" [var-annotated] src/documents/tests/test_barcodes.py:0: error: Need type annotation for "reader" [var-annotated] src/documents/tests/test_barcodes.py:0: error: Need type annotation for "reader" [var-annotated] @@ -1048,19 +963,19 @@ src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_storage_path" src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_storage_path" has incompatible type "int"; expected "StoragePath" [arg-type] src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_storage_path" has incompatible type "int"; expected "StoragePath" [arg-type] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1080,11 +995,6 @@ src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annot src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_bulk_edit.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_bulk_edit.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_bulk_edit.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_bulk_edit.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] -src/documents/tests/test_bulk_edit.py:0: error: Item "None" of "CustomFieldInstance | None" has no attribute "value" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Too few arguments for "count" of "list" [call-arg] @@ -1107,13 +1017,11 @@ src/documents/tests/test_classifier.py:0: error: Function is missing a type anno src/documents/tests/test_classifier.py:0: error: Invalid base class "real_catch_warnings" [misc] src/documents/tests/test_classifier.py:0: error: Module "sklearn.exceptions" has no attribute "InconsistentVersionWarning" [attr-defined] src/documents/tests/test_classifier.py:0: error: Variable "real_catch_warnings" is not valid as a type [valid-type] -src/documents/tests/test_consumer.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | Any | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_consumer.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | Any | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_consumer.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] +src/documents/tests/test_consumer.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_consumer.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_consumer.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] src/documents/tests/test_consumer.py:0: error: Argument 1 to "len" has incompatible type "Any | None"; expected "Sized" [arg-type] src/documents/tests/test_consumer.py:0: error: Argument 1 to "len" has incompatible type "Any | None"; expected "Sized" [arg-type] -src/documents/tests/test_consumer.py:0: error: Argument 2 to "has_perm" of "ObjectPermissionChecker" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_consumer.py:0: error: Argument 2 to "has_perm" of "ObjectPermissionChecker" has incompatible type "Document | None"; expected "Model" [arg-type] src/documents/tests/test_consumer.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_consumer.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_consumer.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -1152,65 +1060,15 @@ src/documents/tests/test_consumer.py:0: error: Function is missing a type annota src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_consumer.py:0: error: Incompatible return value type (got "Path | None", expected "Path") [return-value] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Correspondent | Any | None" has no attribute "id" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_checksum" [union-attr] +src/documents/tests/test_consumer.py:0: error: Item "None" of "Correspondent | None" has no attribute "id" [union-attr] src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_filename" [union-attr] src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_filename" [union-attr] src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_filename" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_filename" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_filename" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_path" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_path" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "archive_serial_number" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "checksum" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "content" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "created" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "created" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "created" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "created" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "created" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "created" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "created" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "delete" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "delete" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "filename" [union-attr] src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "filename" [union-attr] src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "filename" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "filename" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "filename" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "pk" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "pk" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "source_path" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "source_path" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "source_path" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "thumbnail_path" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "DocumentType | Any | None" has no attribute "id" [union-attr] -src/documents/tests/test_consumer.py:0: error: Item "None" of "StoragePath | Any | None" has no attribute "id" [union-attr] +src/documents/tests/test_consumer.py:0: error: Item "None" of "DocumentType | None" has no attribute "id" [union-attr] +src/documents/tests/test_consumer.py:0: error: Item "None" of "StoragePath | None" has no attribute "id" [union-attr] src/documents/tests/test_consumer.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/tests/test_consumer.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/tests/test_consumer_archive.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -1230,25 +1088,23 @@ src/documents/tests/test_file_handling.py:0: error: Argument 1 to "Path" has inc src/documents/tests/test_file_handling.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_file_handling.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_file_handling.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsNotFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsNotFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsNotFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "assertIsNotFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] src/documents/tests/test_file_handling.py:0: error: Argument 1 to "create_source_path_directory" has incompatible type "Path | None"; expected "Path" [arg-type] src/documents/tests/test_file_handling.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_file_handling.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_file_handling.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1259,15 +1115,10 @@ src/documents/tests/test_file_handling.py:0: error: Function is missing a type a src/documents/tests/test_file_handling.py:0: error: Item "None" of "Path | None" has no attribute "write_bytes" [union-attr] src/documents/tests/test_file_handling.py:0: error: Skipping analyzing "auditlog.context": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/tests/test_filters.py:0: error: Argument 1 to "localize_date" has incompatible type "list[object] | dict[Any, Any] | Literal[1698330605] | None"; expected "date | datetime | str" [arg-type] -src/documents/tests/test_filters.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_filters.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_filters.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_filters.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_filters.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_management.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] -src/documents/tests/test_management.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_management.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] -src/documents/tests/test_management.py:0: error: Argument 1 to "assertIsNotFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[Any] | str" [arg-type] +src/documents/tests/test_management.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_management.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] +src/documents/tests/test_management.py:0: error: Argument 1 to "assertIsNotFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] src/documents/tests/test_management.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_management.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_management.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1327,53 +1178,51 @@ src/documents/tests/test_models.py:0: error: Item "None" of "Document | None" ha src/documents/tests/test_parsers.py:0: error: "None" not callable [misc] src/documents/tests/test_parsers.py:0: error: "None" not callable [misc] src/documents/tests/test_parsers.py:0: error: "None" not callable [misc] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_regex.py:0: error: Library stubs not installed for "regex" [import-untyped] src/documents/tests/test_sanity_check.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_sanity_check.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_sanity_check.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] -src/documents/tests/test_sanity_check.py:0: error: Unsupported right operand type for in ("str | None") [operator] src/documents/tests/test_share_link_bundles.py:0: error: "_MonkeyPatchedResponse" has no attribute "streaming_content" [attr-defined] -src/documents/tests/test_share_link_bundles.py:0: error: Argument 1 to "ZipFile" has incompatible type "Path | None"; expected "str | PathLike[str] | IO[bytes]" [arg-type] src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_share_link_bundles.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] -src/documents/tests/test_share_link_bundles.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] -src/documents/tests/test_share_link_bundles.py:0: error: Item "None" of "Path | None" has no attribute "exists" [union-attr] -src/documents/tests/test_share_link_bundles.py:0: error: Item "None" of "Path | None" has no attribute "exists" [union-attr] -src/documents/tests/test_share_link_bundles.py:0: error: Item "None" of "Path | None" has no attribute "read_bytes" [union-attr] src/documents/tests/test_share_link_bundles.py:0: error: Item "None" of "Path | None" has no attribute "resolve" [union-attr] src/documents/tests/test_tag_hierarchy.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] src/documents/tests/test_tag_hierarchy.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] src/documents/tests/test_tag_hierarchy.py:0: error: Argument 2 to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | float | Iterable[str | bytes | float]] | Iterable[tuple[str, str | bytes | float | Iterable[str | bytes | float]]] | None" [arg-type] src/documents/tests/test_tag_hierarchy.py:0: error: Need type annotation for "context" (hint: "context: dict[, ] = ...") [var-annotated] -src/documents/tests/test_task_signals.py:0: error: "TestTaskSignalHandler" has no attribute "user" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "TestTaskSignalHandler" has no attribute "user" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "type[TestTaskSignalHandler]" has no attribute "user" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "str"; expected "Path" [arg-type] -src/documents/tests/test_task_signals.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "str"; expected "Path" [arg-type] -src/documents/tests/test_task_signals.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "str"; expected "Path" [arg-type] -src/documents/tests/test_task_signals.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "str"; expected "Path" [arg-type] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "date_done" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "date_done" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "date_started" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "duration_seconds" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "wait_time_seconds" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_task_signals.py:0: error: Need type annotation for "body" [var-annotated] -src/documents/tests/test_task_signals.py:0: error: Need type annotation for "body" [var-annotated] -src/documents/tests/test_task_signals.py:0: error: Need type annotation for "body" [var-annotated] -src/documents/tests/test_task_signals.py:0: error: Need type annotation for "body" [var-annotated] -src/documents/tests/test_tasks.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] +src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_task_signals.py:0: error: Incompatible return value type (got "PaperlessTaskFactory", expected "PaperlessTask") [return-value] +src/documents/tests/test_task_signals.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/tests/test_task_signals.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/tests/test_task_signals.py:0: error: Missing type arguments for generic type "tuple" [type-arg] +src/documents/tests/test_task_signals.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] +src/documents/tests/test_task_signals.py:0: error: Unsupported right operand type for in ("None") [operator] +src/documents/tests/test_task_signals.py:0: error: Value of type "None" is not indexable [index] +src/documents/tests/test_task_signals.py:0: error: Value of type "None" is not indexable [index] +src/documents/tests/test_task_signals.py:0: error: Value of type "None" is not indexable [index] src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1425,39 +1274,6 @@ src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "Con src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_groups_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument 1 to "get_users_with_perms" has incompatible type "Document | None"; expected "Model" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "list" has incompatible type "Group | dict[Any, Any]"; expected "Iterable[Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "list" has incompatible type "Group | dict[Any, Any]"; expected "Iterable[Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "list" has incompatible type "Group | dict[Any, Any]"; expected "Iterable[Any]" [arg-type] @@ -1470,15 +1286,6 @@ src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" ha src/documents/tests/test_workflows.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] -src/documents/tests/test_workflows.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1496,102 +1303,37 @@ src/documents/tests/test_workflows.py:0: error: Function is missing a type annot src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Any | list[str]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Any | list[str]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "custom_fields" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "document_type" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "owner" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "storage_path" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "tags" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "None" of "Document | None" has no attribute "title" [union-attr] +src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] +src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] +src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] +src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] +src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "url" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "str" of "Any | str" has no attribute "name" [union-attr] -src/documents/tests/test_workflows.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] -src/documents/tests/test_workflows.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] -src/documents/tests/test_workflows.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] -src/documents/tests/test_workflows.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] -src/documents/tests/test_workflows.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] +src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] +src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] +src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] +src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] +src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] src/documents/tests/test_workflows.py:0: error: Too few arguments for "count" of "list" [call-arg] src/documents/tests/test_workflows.py:0: error: Too few arguments for "count" of "list" [call-arg] src/documents/tests/test_workflows.py:0: error: Too few arguments for "count" of "list" [call-arg] @@ -1664,13 +1406,6 @@ src/documents/tests/utils.py:0: error: Function is missing a type annotation for src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/utils.py:0: error: Item "None" of "AppConfig | None" has no attribute "name" [union-attr] src/documents/tests/utils.py:0: error: Missing type arguments for generic type "Callable" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "PathLike" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "PathLike" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "PathLike" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "PathLike" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "PathLike" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "PathLike" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "PathLike" [type-arg] src/documents/tests/utils.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/tests/utils.py:0: error: Missing type arguments for generic type "tuple" [type-arg] src/documents/tests/utils.py:0: error: Need type annotation for "payloads" (hint: "payloads: list[] = ...") [var-annotated] @@ -1684,7 +1419,7 @@ src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "queryse src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "request" [attr-defined] src/documents/views.py:0: error: "get_serializer_context" undefined in superclass [misc] -src/documents/views.py:0: error: "object" not callable [operator] +src/documents/views.py:0: error: "object" has no attribute "apply_async" [attr-defined] src/documents/views.py:0: error: "type[Model]" has no attribute "objects" [attr-defined] src/documents/views.py:0: error: Argument "filename" to "FileResponse" has incompatible type "str | Any | None"; expected "str" [arg-type] src/documents/views.py:0: error: Argument "path" to "EmailAttachment" has incompatible type "Path | None"; expected "Path" [arg-type] @@ -1692,9 +1427,10 @@ src/documents/views.py:0: error: Argument "user" to "_has_document_permissions" src/documents/views.py:0: error: Argument "user" to "_has_document_permissions" of "DocumentOperationPermissionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] +src/documents/views.py:0: error: Argument 1 to "TaskSummarySerializer" has incompatible type "QuerySet[PaperlessTask@AnnotatedWith[TypedDict({'total_count': int, 'pending_count': int, 'success_count': int, 'failure_count': int, 'avg_duration_seconds': Any, 'avg_wait_time_seconds': Any, 'last_run': Any, 'last_success': Any, 'last_failure': Any})], dict[str, Any]]"; expected "dict[str, Any] | None" [arg-type] src/documents/views.py:0: error: Argument 1 to "get_objects_for_user_owner_aware" has incompatible type "User | AnonymousUser"; expected "User | None" [arg-type] -src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] -src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] src/documents/views.py:0: error: Argument 1 to "paginate_queryset" of "GenericAPIView" has incompatible type "TantivyRelevanceList"; expected "QuerySet[Any, Any]" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_correspondents" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_document_types" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] @@ -1714,6 +1450,10 @@ src/documents/views.py:0: error: Function is missing a return type annotation [ src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -1800,12 +1540,16 @@ src/documents/views.py:0: error: Incompatible types in assignment (expression ha src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[DocumentSerializer]", variable has type "type[TrashSerializer]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[OriginalsOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment] src/documents/views.py:0: error: Item "AnonymousUser" of "User | AnonymousUser" has no attribute "get_full_name" [union-attr] +src/documents/views.py:0: error: Item "BasePagination" of "BasePagination | None" has no attribute "get_page_size" [union-attr] +src/documents/views.py:0: error: Item "BasePagination" of "BasePagination | None" has no attribute "page_size" [union-attr] src/documents/views.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/documents/views.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/documents/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] +src/documents/views.py:0: error: Item "None" of "BasePagination | None" has no attribute "get_page_size" [union-attr] +src/documents/views.py:0: error: Item "None" of "BasePagination | None" has no attribute "page_size" [union-attr] src/documents/views.py:0: error: Item "None" of "dict[str, _PingReply] | None" has no attribute "keys" [union-attr] src/documents/views.py:0: error: Missing positional argument "request" in call to "email_documents" [call-arg] -src/documents/views.py:0: error: Missing type arguments for generic type "Serializer" [type-arg] +src/documents/views.py:0: error: Missing type arguments for generic type "GenericViewSet" [type-arg] src/documents/views.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/views.py:0: error: Need type annotation for "authentication_classes" (hint: "authentication_classes: list[] = ...") [var-annotated] src/documents/views.py:0: error: Need type annotation for "children_map" (hint: "children_map: dict[, ] = ...") [var-annotated] @@ -1829,7 +1573,6 @@ src/documents/views.py:0: error: Value of type "Iterable[Group]" is not indexabl src/documents/views.py:0: error: Value of type "Iterable[User]" is not indexable [index] src/documents/views.py:0: error: Value of type "Iterable[Workflow]" is not indexable [index] src/documents/views.py:0: error: Value of type "dict[str, _PingReply] | None" is not indexable [index] -src/documents/workflows/actions.py:0: error: Argument "files" to "delay" of "Task" has incompatible type "dict[str, tuple[str, bytes, str]] | None"; expected "dict[Any, Any]" [arg-type] src/documents/workflows/actions.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/workflows/actions.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/workflows/actions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -2024,6 +1767,7 @@ src/paperless/settings/__init__.py:0: error: Incompatible types in assignment (e src/paperless/settings/__init__.py:0: error: Skipping analyzing "compression_middleware.middleware": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/settings/custom.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless/settings/custom.py:0: error: No overload variant of "getenv" matches argument types "Collection[str]", "Collection[str]" [call-overload] +src/paperless/settings/custom.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[str, str]]" [dict-item] src/paperless/settings/parsers.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "bool") [assignment] src/paperless/settings/parsers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless/settings/parsers.py:0: error: Missing type arguments for generic type "dict" [type-arg] @@ -2034,7 +1778,7 @@ src/paperless/tests/parsers/conftest.py:0: error: Function is missing a type ann src/paperless/tests/parsers/conftest.py:0: error: Incompatible return value type (got "def _make_parser(**django_settings_overrides: Any) -> _GeneratorContextManager[Any, None, None]", expected "Callable[..., Generator[RasterisedDocumentParser, None, None]]") [return-value] src/paperless/tests/parsers/test_convert_image_to_pdfa.py:0: error: Skipping analyzing "img2pdf": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/tests/parsers/test_mail_parser.py:0: error: Argument 1 to "extract_metadata" of "MailDocumentParser" has incompatible type "str"; expected "Path" [arg-type] -src/paperless/tests/parsers/test_mail_parser.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/parsers/test_mail_parser.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/parsers/test_mail_parser.py:0: error: Item "None" of "Request | None" has no attribute "url" [union-attr] src/paperless/tests/parsers/test_mail_parser.py:0: error: Item "None" of "Request | None" has no attribute "url" [union-attr] src/paperless/tests/parsers/test_mail_parser_live.py:0: error: Argument 1 to "extract_text" has incompatible type "Path | None"; expected "Path" [arg-type] @@ -2044,15 +1788,6 @@ src/paperless/tests/parsers/test_parse_modes.py:0: error: Function is missing a src/paperless/tests/parsers/test_parse_modes.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/parsers/test_parse_modes.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_parse_modes.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] src/paperless/tests/parsers/test_remote_parser.py:0: error: Too few arguments [call-arg] src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Argument "input_file" to "construct_ocrmypdf_parameters" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Argument "input_file" to "construct_ocrmypdf_parameters" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] @@ -2061,28 +1796,6 @@ src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Argument src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Argument "sidecar_file" to "construct_ocrmypdf_parameters" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Argument "sidecar_file" to "construct_ocrmypdf_parameters" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "color_conversion_strategy" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "deskew" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "language" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "max_image_pixels" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "mode" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "mode" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "output_type" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "pages" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "unpaper_clean" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "unpaper_clean" [union-attr] -src/paperless/tests/parsers/test_tesseract_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "user_args" [union-attr] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: "Generator[RasterisedDocumentParser, None, None]" has no attribute "__enter__"; maybe "__iter__"? [attr-defined] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: "Generator[RasterisedDocumentParser, None, None]" has no attribute "__enter__"; maybe "__iter__"? [attr-defined] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: "Generator[RasterisedDocumentParser, None, None]" has no attribute "__enter__"; maybe "__iter__"? [attr-defined] @@ -2106,108 +1819,44 @@ src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "as src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "calculate_a4_dpi" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "get_dpi" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 2 to "normalize" has incompatible type "str | None"; expected "str" [arg-type] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] src/paperless/tests/parsers/test_tika_parser.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/paperless/tests/settings/test_custom_parsers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless/tests/settings/test_db_cache.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/settings/test_db_cache.py:0: error: Skipping analyzing "cachalot.settings": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/test_adapter.py:0: error: Cannot assign to a method [method-assign] src/paperless/tests/test_adapter.py:0: error: Cannot assign to a method [method-assign] src/paperless/tests/test_adapter.py:0: error: Cannot assign to a method [method-assign] src/paperless/tests/test_adapter.py:0: error: Skipping analyzing "allauth.account.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/tests/test_adapter.py:0: error: Skipping analyzing "allauth.core": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/tests/test_adapter.py:0: error: Skipping analyzing "allauth.socialaccount.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_celery.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_celery.py:0: error: Value of type "object" is not indexable [index] src/paperless/tests/test_celery.py:0: error: Value of type "object" is not indexable [index] src/paperless/tests/test_checks.py:0: error: Generator has incompatible item type "str | None"; expected "str" [misc] @@ -2220,16 +1869,6 @@ src/paperless/tests/test_checks.py:0: error: Unsupported right operand type for src/paperless/tests/test_logging.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_logging.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Cannot determine type of "apps" [has-type] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] @@ -2289,7 +1928,7 @@ src/paperless/urls.py:0: error: Skipping analyzing "allauth.socialaccount": modu src/paperless/urls.py:0: error: Skipping analyzing "allauth.urls": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/validators.py:0: error: Argument 1 to "join" of "str" has incompatible type "Iterator[str | bytes] | Any"; expected "Iterable[str]" [arg-type] src/paperless/validators.py:0: error: Incompatible types in assignment (expression has type "str | bytes", variable has type "str") [assignment] -src/paperless/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/paperless/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] src/paperless/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -2467,6 +2106,7 @@ src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expressio src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "str", target has type "date") [assignment] src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "str", target has type "date") [assignment] src/paperless_mail/mail.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/paperless_mail/mail.py:0: error: Missing type arguments for generic type "list" [type-arg] src/paperless_mail/management/commands/mail_fetcher.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/models.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/models.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -2491,42 +2131,93 @@ src/paperless_mail/serialisers.py:0: error: Function is missing a type annotatio src/paperless_mail/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/conftest.py:0: error: "MailAccountFactory" has no attribute "delete" [attr-defined] +src/paperless_mail/tests/conftest.py:0: error: Incompatible types in "yield" (actual type "MailAccountFactory", expected type "MailAccount") [misc] +src/paperless_mail/tests/test_api.py:0: error: "CorrespondentFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "DocumentTypeFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_attachment_filename_include" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_body" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_from" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_subject" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_to" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "refresh_from_db" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: "TagFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "MailAccountFactory"; expected "Model | None" [arg-type] +src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "MailAccountFactory"; expected "Model | None" [arg-type] +src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "MailRuleFactory"; expected "Model | None" [arg-type] +src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "ProcessedMailFactory"; expected "Model | None" [arg-type] +src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "ProcessedMailFactory"; expected "Model | None" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "CorrespondentFactory" has no attribute "id" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "CorrespondentFactory" has no attribute "id" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "flagged" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "flagged" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "seen" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "seen" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[att@482]" has no attribute "filename" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message2@428]" has no attribute "from_" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message2@428]" has no attribute "from_" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message2@428]" has no attribute "from_values" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@421]" has no attribute "from_" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@421]" has no attribute "from_values" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@480]" has no attribute "subject" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@533]" has no attribute "attachments" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "MailRuleFactory" has no attribute "action_parameter" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[att@486]" has no attribute "filename" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2@432]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2@432]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2@432]" has no attribute "from_values" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@425]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@425]" has no attribute "from_values" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@484]" has no attribute "subject" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@537]" has no attribute "attachments" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxFolderSelectError" has incompatible type "None"; expected "tuple[Any, ...]" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxFolderSelectError" has incompatible type "None"; expected "tuple[Any, ...]" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2@428]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2@428]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@421]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@421]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@421]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@421]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@480]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@480]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@480]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2@432]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2@432]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@484]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@484]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@484]"; expected "MailMessage" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "filter" has incompatible type "Callable[[Any], bool]"; expected "Callable[[MailMessage], TypeGuard[Never]]" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "filter" has incompatible type "Callable[[Any], bool]"; expected "Callable[[MailMessage], TypeGuard[Never]]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@482]"; expected "MailAttachment" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@482]"; expected "MailAttachment" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@482]"; expected "MailAttachment" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@486]"; expected "MailAttachment" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@486]"; expected "MailAttachment" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@486]"; expected "MailAttachment" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Dict entry 0 has incompatible type "str": "None"; expected "str": "str" [dict-item] src/paperless_mail/tests/test_mail.py:0: error: Dict entry 0 has incompatible type "str": "int"; expected "str": "str" [dict-item] @@ -2539,10 +2230,6 @@ src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annot src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -2563,6 +2250,11 @@ src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annot src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Incompatible type for "assign_correspondent" of "MailRule" (got "CorrespondentFactory", expected "Correspondent | Combinable | None") [misc] src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] @@ -2578,16 +2270,18 @@ src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] -src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "MailRule | None" has no attribute "name" [union-attr] src/paperless_mail/tests/test_mail.py:0: error: Missing type arguments for generic type "AbstractContextManager" [type-arg] src/paperless_mail/tests/test_mail.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] -src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_oauth.py:0: error: Argument 1 to "handle_mail_account" of "MailAccountHandler" has incompatible type "MailAccountFactory"; expected "MailAccount" [arg-type] +src/paperless_mail/tests/test_mail_oauth.py:0: error: Argument 1 to "handle_mail_account" of "MailAccountHandler" has incompatible type "MailAccountFactory"; expected "MailAccount" [arg-type] +src/paperless_mail/tests/test_mail_oauth.py:0: error: Argument 1 to "handle_mail_account" of "MailAccountHandler" has incompatible type "MailAccountFactory"; expected "MailAccount" [arg-type] +src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_preprocessor.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] src/paperless_mail/tests/test_preprocessor.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] @@ -2600,6 +2294,7 @@ src/paperless_mail/tests/test_preprocessor.py:0: error: "type[TestMailMessageGpg src/paperless_mail/tests/test_preprocessor.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/tests/test_preprocessor.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/tests/test_preprocessor.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_preprocessor.py:0: error: Incompatible type for "account" of "MailRule" (got "MailAccountFactory", expected "MailAccount | Combinable | None") [misc] src/paperless_mail/tests/test_preprocessor.py:0: error: Skipping analyzing "gnupg": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless_mail/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] diff --git a/.pyrefly-baseline.json b/.pyrefly-baseline.json index d3d005516..87578462d 100644 --- a/.pyrefly-baseline.json +++ b/.pyrefly-baseline.json @@ -13,9 +13,9 @@ "severity": "error" }, { - "line": 244, + "line": 255, "column": 27, - "stop_line": 244, + "stop_line": 255, "stop_column": 35, "path": "src/documents/admin.py", "code": -2, @@ -25,21 +25,21 @@ "severity": "error" }, { - "line": 254, + "line": 269, "column": 16, - "stop_line": 254, + "stop_line": 269, "stop_column": 24, "path": "src/documents/barcodes.py", "code": -2, "name": "missing-import", - "description": "Cannot find module `zxingcpp`\n Looked in these locations (from config in `/tank/users/trenton/projects/paperless/paperless-ngx/pyproject.toml`):\n Search path (from config file): [\"/tank/users/trenton/projects/paperless/paperless-ngx/src\"]\n Import root (inferred from project layout): \"/tank/users/trenton/projects/paperless/paperless-ngx/src\"\n Site package path queried from interpreter: [\"/tank/users/trenton/projects/paperless/paperless-ngx/.venv/lib/python3.14/site-packages\"]", + "description": "Cannot find module `zxingcpp`\n Looked in these locations (from config in `/home/trenton/projects/paperless-ngx/pyproject.toml`):\n Search path (from config file): [\"/home/trenton/projects/paperless-ngx/src\"]\n Import root (inferred from project layout): \"/home/trenton/projects/paperless-ngx/src\"\n Site package path queried from interpreter: [\"/home/trenton/projects/paperless-ngx/.venv/lib/python3.13/site-packages\"]", "concise_description": "Cannot find module `zxingcpp`", "severity": "error" }, { - "line": 310, + "line": 325, "column": 38, - "stop_line": 310, + "stop_line": 325, "stop_column": 51, "path": "src/documents/barcodes.py", "code": -2, @@ -49,9 +49,9 @@ "severity": "error" }, { - "line": 260, + "line": 277, "column": 16, - "stop_line": 260, + "stop_line": 277, "stop_column": 23, "path": "src/documents/bulk_edit.py", "code": -2, @@ -61,9 +61,9 @@ "severity": "error" }, { - "line": 274, + "line": 291, "column": 9, - "stop_line": 276, + "stop_line": 293, "stop_column": 60, "path": "src/documents/bulk_edit.py", "code": -2, @@ -73,9 +73,9 @@ "severity": "error" }, { - "line": 280, + "line": 297, "column": 32, - "stop_line": 280, + "stop_line": 297, "stop_column": 40, "path": "src/documents/bulk_edit.py", "code": -2, @@ -85,9 +85,9 @@ "severity": "error" }, { - "line": 282, + "line": 299, "column": 9, - "stop_line": 282, + "stop_line": 299, "stop_column": 24, "path": "src/documents/bulk_edit.py", "code": -2, @@ -97,9 +97,9 @@ "severity": "error" }, { - "line": 288, + "line": 305, "column": 21, - "stop_line": 288, + "stop_line": 305, "stop_column": 43, "path": "src/documents/bulk_edit.py", "code": -2, @@ -109,9 +109,9 @@ "severity": "error" }, { - "line": 324, + "line": 341, "column": 5, - "stop_line": 327, + "stop_line": 344, "stop_column": 18, "path": "src/documents/bulk_edit.py", "code": -2, @@ -121,9 +121,9 @@ "severity": "error" }, { - "line": 693, + "line": 724, "column": 33, - "stop_line": 693, + "stop_line": 724, "stop_column": 63, "path": "src/documents/bulk_edit.py", "code": -2, @@ -133,9 +133,9 @@ "severity": "error" }, { - "line": 990, + "line": 1032, "column": 13, - "stop_line": 990, + "stop_line": 1032, "stop_column": 64, "path": "src/documents/bulk_edit.py", "code": -2, @@ -265,9 +265,9 @@ "severity": "error" }, { - "line": 78, + "line": 79, "column": 9, - "stop_line": 78, + "stop_line": 79, "stop_column": 23, "path": "src/documents/consumer.py", "code": -2, @@ -277,9 +277,9 @@ "severity": "error" }, { - "line": 197, + "line": 207, "column": 26, - "stop_line": 197, + "stop_line": 207, "stop_column": 35, "path": "src/documents/consumer.py", "code": -2, @@ -289,9 +289,9 @@ "severity": "error" }, { - "line": 199, + "line": 209, "column": 9, - "stop_line": 199, + "stop_line": 209, "stop_column": 33, "path": "src/documents/consumer.py", "code": -2, @@ -301,9 +301,9 @@ "severity": "error" }, { - "line": 201, + "line": 211, "column": 25, - "stop_line": 201, + "stop_line": 211, "stop_column": 38, "path": "src/documents/consumer.py", "code": -2, @@ -313,9 +313,9 @@ "severity": "error" }, { - "line": 201, + "line": 211, "column": 51, - "stop_line": 201, + "stop_line": 211, "stop_column": 65, "path": "src/documents/consumer.py", "code": -2, @@ -325,9 +325,9 @@ "severity": "error" }, { - "line": 211, + "line": 221, "column": 9, - "stop_line": 211, + "stop_line": 221, "stop_column": 24, "path": "src/documents/consumer.py", "code": -2, @@ -337,9 +337,9 @@ "severity": "error" }, { - "line": 217, + "line": 227, "column": 22, - "stop_line": 217, + "stop_line": 227, "stop_column": 35, "path": "src/documents/consumer.py", "code": -2, @@ -349,9 +349,9 @@ "severity": "error" }, { - "line": 217, + "line": 227, "column": 48, - "stop_line": 217, + "stop_line": 227, "stop_column": 61, "path": "src/documents/consumer.py", "code": -2, @@ -361,9 +361,9 @@ "severity": "error" }, { - "line": 218, + "line": 228, "column": 29, - "stop_line": 218, + "stop_line": 228, "stop_column": 42, "path": "src/documents/consumer.py", "code": -2, @@ -373,9 +373,9 @@ "severity": "error" }, { - "line": 219, + "line": 229, "column": 16, - "stop_line": 219, + "stop_line": 229, "stop_column": 29, "path": "src/documents/consumer.py", "code": -2, @@ -385,9 +385,9 @@ "severity": "error" }, { - "line": 220, + "line": 230, "column": 30, - "stop_line": 220, + "stop_line": 230, "stop_column": 43, "path": "src/documents/consumer.py", "code": -2, @@ -397,9 +397,9 @@ "severity": "error" }, { - "line": 221, + "line": 231, "column": 16, - "stop_line": 221, + "stop_line": 231, "stop_column": 29, "path": "src/documents/consumer.py", "code": -2, @@ -409,9 +409,9 @@ "severity": "error" }, { - "line": 319, + "line": 328, "column": 17, - "stop_line": 319, + "stop_line": 328, "stop_column": 25, "path": "src/documents/consumer.py", "code": -2, @@ -421,9 +421,9 @@ "severity": "error" }, { - "line": 396, + "line": 397, "column": 17, - "stop_line": 396, + "stop_line": 397, "stop_column": 25, "path": "src/documents/consumer.py", "code": -2, @@ -433,9 +433,57 @@ "severity": "error" }, { - "line": 441, + "line": 408, + "column": 9, + "stop_line": 408, + "stop_column": 12, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ConsumerPlugin.run` overrides parent class `AlwaysRunPluginMixin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `AlwaysRunPluginMixin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", + "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `AlwaysRunPluginMixin` in an inconsistent manner", + "severity": "error" + }, + { + "line": 408, + "column": 9, + "stop_line": 408, + "stop_column": 12, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ConsumerPlugin.run` overrides parent class `NoSetupPluginMixin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `NoSetupPluginMixin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", + "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `NoSetupPluginMixin` in an inconsistent manner", + "severity": "error" + }, + { + "line": 408, + "column": 9, + "stop_line": 408, + "stop_column": 12, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ConsumerPlugin.run` overrides parent class `NoCleanupPluginMixin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `NoCleanupPluginMixin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", + "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `NoCleanupPluginMixin` in an inconsistent manner", + "severity": "error" + }, + { + "line": 408, + "column": 9, + "stop_line": 408, + "stop_column": 12, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ConsumerPlugin.run` overrides parent class `ConsumeTaskPlugin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `ConsumeTaskPlugin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", + "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `ConsumeTaskPlugin` in an inconsistent manner", + "severity": "error" + }, + { + "line": 442, "column": 25, - "stop_line": 445, + "stop_line": 446, "stop_column": 26, "path": "src/documents/consumer.py", "code": -2, @@ -445,9 +493,9 @@ "severity": "error" }, { - "line": 446, + "line": 447, "column": 32, - "stop_line": 446, + "stop_line": 447, "stop_column": 40, "path": "src/documents/consumer.py", "code": -2, @@ -457,9 +505,9 @@ "severity": "error" }, { - "line": 517, + "line": 518, "column": 25, - "stop_line": 517, + "stop_line": 518, "stop_column": 33, "path": "src/documents/consumer.py", "code": -2, @@ -469,9 +517,9 @@ "severity": "error" }, { - "line": 547, + "line": 548, "column": 74, - "stop_line": 547, + "stop_line": 548, "stop_column": 78, "path": "src/documents/consumer.py", "code": -2, @@ -481,9 +529,9 @@ "severity": "error" }, { - "line": 629, + "line": 630, "column": 33, - "stop_line": 629, + "stop_line": 630, "stop_column": 60, "path": "src/documents/consumer.py", "code": -2, @@ -493,9 +541,9 @@ "severity": "error" }, { - "line": 644, + "line": 645, "column": 38, - "stop_line": 644, + "stop_line": 645, "stop_column": 42, "path": "src/documents/consumer.py", "code": -2, @@ -505,9 +553,9 @@ "severity": "error" }, { - "line": 711, + "line": 716, "column": 62, - "stop_line": 711, + "stop_line": 716, "stop_column": 83, "path": "src/documents/consumer.py", "code": -2, @@ -517,9 +565,9 @@ "severity": "error" }, { - "line": 718, + "line": 723, "column": 37, - "stop_line": 718, + "stop_line": 723, "stop_column": 58, "path": "src/documents/consumer.py", "code": -2, @@ -529,9 +577,9 @@ "severity": "error" }, { - "line": 802, + "line": 807, "column": 13, - "stop_line": 802, + "stop_line": 807, "stop_column": 31, "path": "src/documents/consumer.py", "code": -2, @@ -541,9 +589,9 @@ "severity": "error" }, { - "line": 803, + "line": 808, "column": 13, - "stop_line": 803, + "stop_line": 808, "stop_column": 26, "path": "src/documents/consumer.py", "code": -2, @@ -553,9 +601,9 @@ "severity": "error" }, { - "line": 804, + "line": 809, "column": 13, - "stop_line": 804, + "stop_line": 809, "stop_column": 27, "path": "src/documents/consumer.py", "code": -2, @@ -565,9 +613,9 @@ "severity": "error" }, { - "line": 926, + "line": 931, "column": 31, - "stop_line": 926, + "stop_line": 931, "stop_column": 46, "path": "src/documents/consumer.py", "code": -2, @@ -577,9 +625,9 @@ "severity": "error" }, { - "line": 998, + "line": 1003, "column": 21, - "stop_line": 998, + "stop_line": 1003, "stop_column": 36, "path": "src/documents/consumer.py", "code": -2, @@ -589,9 +637,9 @@ "severity": "error" }, { - "line": 999, + "line": 1004, "column": 24, - "stop_line": 999, + "stop_line": 1004, "stop_column": 51, "path": "src/documents/consumer.py", "code": -2, @@ -601,21 +649,21 @@ "severity": "error" }, { - "line": 1000, + "line": 1005, "column": 30, - "stop_line": 1000, + "stop_line": 1005, "stop_column": 48, "path": "src/documents/consumer.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `object | Unknown` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `object | Unknown` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `object | Unknown` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 1000, + "line": 1005, "column": 58, - "stop_line": 1000, + "stop_line": 1005, "stop_column": 76, "path": "src/documents/consumer.py", "code": -2, @@ -625,9 +673,9 @@ "severity": "error" }, { - "line": 1001, + "line": 1006, "column": 28, - "stop_line": 1001, + "stop_line": 1006, "stop_column": 40, "path": "src/documents/consumer.py", "code": -2, @@ -637,9 +685,9 @@ "severity": "error" }, { - "line": 1008, + "line": 1013, "column": 65, - "stop_line": 1008, + "stop_line": 1013, "stop_column": 77, "path": "src/documents/consumer.py", "code": -2, @@ -649,9 +697,21 @@ "severity": "error" }, { - "line": 1085, + "line": 1028, + "column": 21, + "stop_line": 1028, + "stop_column": 33, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `pk`", + "concise_description": "Object of class `NoneType` has no attribute `pk`", + "severity": "error" + }, + { + "line": 1094, "column": 16, - "stop_line": 1085, + "stop_line": 1094, "stop_column": 51, "path": "src/documents/consumer.py", "code": -2, @@ -685,9 +745,9 @@ "severity": "error" }, { - "line": 115, + "line": 116, "column": 13, - "stop_line": 118, + "stop_line": 119, "stop_column": 26, "path": "src/documents/data_models.py", "code": -2, @@ -697,9 +757,9 @@ "severity": "error" }, { - "line": 121, + "line": 122, "column": 13, - "stop_line": 124, + "stop_line": 125, "stop_column": 26, "path": "src/documents/data_models.py", "code": -2, @@ -709,9 +769,9 @@ "severity": "error" }, { - "line": 137, + "line": 138, "column": 26, - "stop_line": 137, + "stop_line": 138, "stop_column": 43, "path": "src/documents/data_models.py", "code": -2, @@ -721,9 +781,9 @@ "severity": "error" }, { - "line": 138, + "line": 139, "column": 35, - "stop_line": 138, + "stop_line": 139, "stop_column": 59, "path": "src/documents/data_models.py", "code": -2, @@ -733,9 +793,9 @@ "severity": "error" }, { - "line": 142, + "line": 143, "column": 26, - "stop_line": 142, + "stop_line": 143, "stop_column": 43, "path": "src/documents/data_models.py", "code": -2, @@ -745,9 +805,9 @@ "severity": "error" }, { - "line": 143, + "line": 144, "column": 37, - "stop_line": 143, + "stop_line": 144, "stop_column": 61, "path": "src/documents/data_models.py", "code": -2, @@ -757,9 +817,9 @@ "severity": "error" }, { - "line": 172, + "line": 173, "column": 22, - "stop_line": 172, + "stop_line": 173, "stop_column": 65, "path": "src/documents/data_models.py", "code": -2, @@ -817,9 +877,9 @@ "severity": "error" }, { - "line": 206, + "line": 210, "column": 51, - "stop_line": 206, + "stop_line": 210, "stop_column": 61, "path": "src/documents/filters.py", "code": -2, @@ -829,9 +889,9 @@ "severity": "error" }, { - "line": 262, + "line": 266, "column": 31, - "stop_line": 262, + "stop_line": 266, "stop_column": 51, "path": "src/documents/filters.py", "code": -2, @@ -841,9 +901,9 @@ "severity": "error" }, { - "line": 294, + "line": 326, "column": 25, - "stop_line": 294, + "stop_line": 326, "stop_column": 66, "path": "src/documents/filters.py", "code": -2, @@ -853,9 +913,9 @@ "severity": "error" }, { - "line": 321, + "line": 353, "column": 47, - "stop_line": 321, + "stop_line": 353, "stop_column": 76, "path": "src/documents/filters.py", "code": -2, @@ -865,9 +925,9 @@ "severity": "error" }, { - "line": 330, + "line": 362, "column": 5, - "stop_line": 330, + "stop_line": 362, "stop_column": 26, "path": "src/documents/filters.py", "code": -2, @@ -877,9 +937,9 @@ "severity": "error" }, { - "line": 635, + "line": 673, "column": 26, - "stop_line": 635, + "stop_line": 673, "stop_column": 49, "path": "src/documents/filters.py", "code": -2, @@ -889,9 +949,9 @@ "severity": "error" }, { - "line": 638, + "line": 676, "column": 17, - "stop_line": 638, + "stop_line": 676, "stop_column": 28, "path": "src/documents/filters.py", "code": -2, @@ -901,9 +961,9 @@ "severity": "error" }, { - "line": 695, + "line": 733, "column": 18, - "stop_line": 695, + "stop_line": 733, "stop_column": 41, "path": "src/documents/filters.py", "code": -2, @@ -913,9 +973,9 @@ "severity": "error" }, { - "line": 969, + "line": 1040, "column": 25, - "stop_line": 969, + "stop_line": 1040, "stop_column": 45, "path": "src/documents/filters.py", "code": -2, @@ -937,9 +997,9 @@ "severity": "error" }, { - "line": 118, + "line": 119, "column": 13, - "stop_line": 118, + "stop_line": 119, "stop_column": 29, "path": "src/documents/management/commands/document_exporter.py", "code": -2, @@ -949,9 +1009,9 @@ "severity": "error" }, { - "line": 121, + "line": 122, "column": 9, - "stop_line": 121, + "stop_line": 122, "stop_column": 25, "path": "src/documents/management/commands/document_exporter.py", "code": -2, @@ -961,9 +1021,9 @@ "severity": "error" }, { - "line": 564, + "line": 565, "column": 41, - "stop_line": 564, + "stop_line": 565, "stop_column": 50, "path": "src/documents/management/commands/document_exporter.py", "code": -2, @@ -972,18 +1032,6 @@ "concise_description": "Argument `Path | str` is not assignable to parameter `element` with type `str` in function `set.add`", "severity": "error" }, - { - "line": 91, - "column": 38, - "stop_line": 91, - "stop_column": 70, - "path": "src/documents/management/commands/document_fuzzy_match.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `list[tuple[int, int] | tuple[int, ...]]` is not assignable to parameter `*s` with type `Iterable[tuple[int, int]]` in function `set.update`", - "concise_description": "Argument `list[tuple[int, int] | tuple[int, ...]]` is not assignable to parameter `*s` with type `Iterable[tuple[int, int]]` in function `set.update`", - "severity": "error" - }, { "line": 238, "column": 14, @@ -991,7 +1039,7 @@ "stop_column": 18, "path": "src/documents/management/commands/document_importer.py", "code": -2, - "name": "bad-override", + "name": "bad-override-mutable-attribute", "description": "Class member `Command.salt` overrides parent class `CryptMixin` in an inconsistent manner\n `Command.salt` has type `str | None`, which is not consistent with `str` in `CryptMixin.salt` (the type of read-write attributes cannot be changed)", "concise_description": "Class member `Command.salt` overrides parent class `CryptMixin` in an inconsistent manner", "severity": "error" @@ -1004,7 +1052,7 @@ "path": "src/documents/management/commands/document_importer.py", "code": -2, "name": "unsupported-operation", - "description": "`/` is not supported between `Path` and `None`\n Argument `None` is not assignable to parameter `key` with type `PathLike[str] | str` in function `pathlib.PurePath.__truediv__`", + "description": "`/` is not supported between `Path` and `None`\n Argument `None` is not assignable to parameter `key` with type `PathLike[str] | str` in function `pathlib.PurePath.__truediv__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "`/` is not supported between `Path` and `None`", "severity": "error" }, @@ -1016,7 +1064,7 @@ "path": "src/documents/management/commands/document_importer.py", "code": -2, "name": "unsupported-operation", - "description": "`/` is not supported between `Path` and `None`\n Argument `None` is not assignable to parameter `key` with type `PathLike[str] | str` in function `pathlib.PurePath.__truediv__`", + "description": "`/` is not supported between `Path` and `None`\n Argument `None` is not assignable to parameter `key` with type `PathLike[str] | str` in function `pathlib.PurePath.__truediv__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "`/` is not supported between `Path` and `None`", "severity": "error" }, @@ -1177,9 +1225,9 @@ "severity": "error" }, { - "line": 117, + "line": 116, "column": 11, - "stop_line": 117, + "stop_line": 116, "stop_column": 15, "path": "src/documents/models.py", "code": -2, @@ -1189,21 +1237,21 @@ "severity": "error" }, { - "line": 451, + "line": 453, "column": 21, - "stop_line": 451, + "stop_line": 453, "stop_column": 38, "path": "src/documents/models.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 959, + "line": 1031, "column": 9, - "stop_line": 959, + "stop_line": 1031, "stop_column": 15, "path": "src/documents/models.py", "code": -2, @@ -1213,9 +1261,9 @@ "severity": "error" }, { - "line": 1134, + "line": 1206, "column": 54, - "stop_line": 1134, + "stop_line": 1206, "stop_column": 74, "path": "src/documents/models.py", "code": -2, @@ -1225,9 +1273,9 @@ "severity": "error" }, { - "line": 1158, + "line": 1230, "column": 5, - "stop_line": 1158, + "stop_line": 1230, "stop_column": 13, "path": "src/documents/models.py", "code": -2, @@ -1309,9 +1357,9 @@ "severity": "error" }, { - "line": 167, + "line": 186, "column": 24, - "stop_line": 167, + "stop_line": 186, "stop_column": 51, "path": "src/documents/search/_backend.py", "code": -2, @@ -1321,9 +1369,9 @@ "severity": "error" }, { - "line": 173, + "line": 192, "column": 17, - "stop_line": 173, + "stop_line": 192, "stop_column": 36, "path": "src/documents/search/_backend.py", "code": -2, @@ -1333,9 +1381,9 @@ "severity": "error" }, { - "line": 174, + "line": 193, "column": 17, - "stop_line": 174, + "stop_line": 193, "stop_column": 44, "path": "src/documents/search/_backend.py", "code": -2, @@ -1345,9 +1393,9 @@ "severity": "error" }, { - "line": 203, + "line": 222, "column": 9, - "stop_line": 203, + "stop_line": 222, "stop_column": 34, "path": "src/documents/search/_backend.py", "code": -2, @@ -1357,9 +1405,9 @@ "severity": "error" }, { - "line": 213, + "line": 235, "column": 9, - "stop_line": 213, + "stop_line": 235, "stop_column": 47, "path": "src/documents/search/_backend.py", "code": -2, @@ -1369,9 +1417,9 @@ "severity": "error" }, { - "line": 215, + "line": 237, "column": 17, - "stop_line": 215, + "stop_line": 237, "stop_column": 38, "path": "src/documents/search/_backend.py", "code": -2, @@ -1381,9 +1429,57 @@ "severity": "error" }, { - "line": 309, + "line": 333, + "column": 44, + "stop_line": 333, + "stop_column": 55, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_query`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_query`", + "severity": "error" + }, + { + "line": 335, + "column": 45, + "stop_line": 335, + "stop_column": 56, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_title_query`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_title_query`", + "severity": "error" + }, + { + "line": 337, + "column": 37, + "stop_line": 337, + "stop_column": 48, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_user_query`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_user_query`", + "severity": "error" + }, + { + "line": 346, + "column": 57, + "stop_line": 346, + "stop_column": 69, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", + "severity": "error" + }, + { + "line": 389, "column": 50, - "stop_line": 309, + "stop_line": 389, "stop_column": 75, "path": "src/documents/search/_backend.py", "code": -2, @@ -1393,9 +1489,9 @@ "severity": "error" }, { - "line": 315, + "line": 395, "column": 50, - "stop_line": 315, + "stop_line": 395, "stop_column": 75, "path": "src/documents/search/_backend.py", "code": -2, @@ -1405,9 +1501,9 @@ "severity": "error" }, { - "line": 320, + "line": 400, "column": 49, - "stop_line": 320, + "stop_line": 400, "stop_column": 73, "path": "src/documents/search/_backend.py", "code": -2, @@ -1417,9 +1513,9 @@ "severity": "error" }, { - "line": 332, + "line": 414, "column": 21, - "stop_line": 332, + "stop_line": 414, "stop_column": 35, "path": "src/documents/search/_backend.py", "code": -2, @@ -1429,9 +1525,9 @@ "severity": "error" }, { - "line": 338, + "line": 423, "column": 20, - "stop_line": 338, + "stop_line": 423, "stop_column": 42, "path": "src/documents/search/_backend.py", "code": -2, @@ -1441,9 +1537,9 @@ "severity": "error" }, { - "line": 380, + "line": 465, "column": 43, - "stop_line": 380, + "stop_line": 465, "stop_column": 50, "path": "src/documents/search/_backend.py", "code": -2, @@ -1453,57 +1549,33 @@ "severity": "error" }, { - "line": 467, - "column": 50, - "stop_line": 467, - "stop_column": 61, + "line": 555, + "column": 65, + "stop_line": 555, + "stop_column": 76, "path": "src/documents/search/_backend.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_query`", + "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_highlight_query`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_highlight_query`", "severity": "error" }, { - "line": 469, - "column": 51, - "stop_line": 469, - "stop_column": 62, + "line": 566, + "column": 17, + "stop_line": 566, + "stop_column": 40, "path": "src/documents/search/_backend.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_title_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_title_query`", + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `parse_query`", + "concise_description": "Object of class `NoneType` has no attribute `parse_query`", "severity": "error" }, { - "line": 471, - "column": 43, - "stop_line": 471, - "stop_column": 54, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_user_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_user_query`", - "severity": "error" - }, - { - "line": 475, - "column": 57, - "stop_line": 475, - "stop_column": 69, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", - "severity": "error" - }, - { - "line": 485, + "line": 573, "column": 20, - "stop_line": 485, + "stop_line": 573, "stop_column": 40, "path": "src/documents/search/_backend.py", "code": -2, @@ -1513,9 +1585,33 @@ "severity": "error" }, { - "line": 552, + "line": 582, + "column": 17, + "stop_line": 582, + "stop_column": 29, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", + "severity": "error" + }, + { + "line": 609, + "column": 25, + "stop_line": 609, + "stop_column": 37, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", + "severity": "error" + }, + { + "line": 624, "column": 29, - "stop_line": 552, + "stop_line": 624, "stop_column": 41, "path": "src/documents/search/_backend.py", "code": -2, @@ -1525,21 +1621,9 @@ "severity": "error" }, { - "line": 566, - "column": 33, - "stop_line": 566, - "stop_column": 45, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", - "severity": "error" - }, - { - "line": 617, + "line": 679, "column": 20, - "stop_line": 617, + "stop_line": 679, "stop_column": 40, "path": "src/documents/search/_backend.py", "code": -2, @@ -1549,9 +1633,45 @@ "severity": "error" }, { - "line": 621, + "line": 739, + "column": 20, + "stop_line": 739, + "stop_column": 40, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `searcher`", + "concise_description": "Object of class `NoneType` has no attribute `searcher`", + "severity": "error" + }, + { + "line": 752, + "column": 25, + "stop_line": 752, + "stop_column": 37, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.term_query`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.term_query`", + "severity": "error" + }, + { + "line": 760, + "column": 25, + "stop_line": 760, + "stop_column": 37, + "path": "src/documents/search/_backend.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.regex_query`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.regex_query`", + "severity": "error" + }, + { + "line": 770, "column": 37, - "stop_line": 621, + "stop_line": 770, "stop_column": 54, "path": "src/documents/search/_backend.py", "code": -2, @@ -1561,10 +1681,10 @@ "severity": "error" }, { - "line": 622, - "column": 50, - "stop_line": 622, - "stop_column": 62, + "line": 774, + "column": 66, + "stop_line": 774, + "stop_column": 78, "path": "src/documents/search/_backend.py", "code": -2, "name": "bad-argument-type", @@ -1573,9 +1693,9 @@ "severity": "error" }, { - "line": 671, + "line": 822, "column": 20, - "stop_line": 671, + "stop_line": 822, "stop_column": 40, "path": "src/documents/search/_backend.py", "code": -2, @@ -1585,9 +1705,9 @@ "severity": "error" }, { - "line": 675, + "line": 825, "column": 13, - "stop_line": 675, + "stop_line": 825, "stop_column": 25, "path": "src/documents/search/_backend.py", "code": -2, @@ -1596,18 +1716,6 @@ "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", "severity": "error" }, - { - "line": 704, - "column": 57, - "stop_line": 704, - "stop_column": 69, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", - "severity": "error" - }, { "line": 132, "column": 9, @@ -1615,7 +1723,7 @@ "stop_column": 17, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-param-name-override", + "name": "bad-override-param-name", "description": "Class member `MatchingModelSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner\n Got parameter name `data`, expected `attrs`", "concise_description": "Class member `MatchingModelSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner", "severity": "error" @@ -1663,7 +1771,7 @@ "stop_column": 26, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-param-name-override", + "name": "bad-override-param-name", "description": "Class member `OwnedObjectListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner\n Got parameter name `documents`, expected `data`", "concise_description": "Class member `OwnedObjectListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner", "severity": "error" @@ -1693,51 +1801,27 @@ "severity": "error" }, { - "line": 483, - "column": 11, - "stop_line": 483, - "stop_column": 15, + "line": 484, + "column": 17, + "stop_line": 484, + "stop_column": 30, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `CorrespondentSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner\n `CorrespondentSerializer.Meta` has type `type[CorrespondentSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `MatchingModelSerializer.Meta`", - "concise_description": "Class member `CorrespondentSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[Correspondent]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[Correspondent]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 483, - "column": 11, - "stop_line": 483, - "stop_column": 15, + "line": 503, + "column": 17, + "stop_line": 503, + "stop_column": 29, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `CorrespondentSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `CorrespondentSerializer.Meta` has type `type[CorrespondentSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `CorrespondentSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 502, - "column": 11, - "stop_line": 502, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `DocumentTypeSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner\n `DocumentTypeSerializer.Meta` has type `type[DocumentTypeSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `MatchingModelSerializer.Meta`", - "concise_description": "Class member `DocumentTypeSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 502, - "column": 11, - "stop_line": 502, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `DocumentTypeSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `DocumentTypeSerializer.Meta` has type `type[DocumentTypeSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `DocumentTypeSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[DocumentType]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[DocumentType]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { @@ -1753,27 +1837,15 @@ "severity": "error" }, { - "line": 627, - "column": 11, - "stop_line": 627, - "stop_column": 15, + "line": 628, + "column": 17, + "stop_line": 628, + "stop_column": 20, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `TagSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner\n `TagSerializer.Meta` has type `type[TagSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `MatchingModelSerializer.Meta`", - "concise_description": "Class member `TagSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 627, - "column": 11, - "stop_line": 627, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `TagSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `TagSerializer.Meta` has type `type[TagSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `TagSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[Tag]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[Tag]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { @@ -1783,7 +1855,7 @@ "stop_column": 17, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-param-name-override", + "name": "bad-override-param-name", "description": "Class member `TagSerializer.validate` overrides parent class `MatchingModelSerializer` in an inconsistent manner\n Got parameter name `attrs`, expected `data`", "concise_description": "Class member `TagSerializer.validate` overrides parent class `MatchingModelSerializer` in an inconsistent manner", "severity": "error" @@ -1801,15 +1873,15 @@ "severity": "error" }, { - "line": 713, - "column": 11, - "stop_line": 713, - "stop_column": 15, + "line": 714, + "column": 17, + "stop_line": 714, + "stop_column": 28, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `CustomFieldSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `CustomFieldSerializer.Meta` has type `type[CustomFieldSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `CustomFieldSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[CustomField]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[CustomField]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { @@ -1843,7 +1915,7 @@ "stop_column": 18, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-param-name-override", + "name": "bad-override-param-name", "description": "Class member `CustomFieldInstanceSerializer.get_value` overrides parent class `ModelSerializer` in an inconsistent manner\n Got parameter name `obj`, expected `dictionary`", "concise_description": "Class member `CustomFieldInstanceSerializer.get_value` overrides parent class `ModelSerializer` in an inconsistent manner", "severity": "error" @@ -1855,7 +1927,7 @@ "stop_column": 17, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-param-name-override", + "name": "bad-override-param-name", "description": "Class member `CustomFieldInstanceSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner\n Got parameter name `data`, expected `attrs`", "concise_description": "Class member `CustomFieldInstanceSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner", "severity": "error" @@ -1873,45 +1945,45 @@ "severity": "error" }, { - "line": 917, - "column": 11, - "stop_line": 917, - "stop_column": 15, + "line": 920, + "column": 17, + "stop_line": 920, + "stop_column": 36, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `CustomFieldInstanceSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `CustomFieldInstanceSerializer.Meta` has type `type[CustomFieldInstanceSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `CustomFieldInstanceSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[CustomFieldInstance]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[CustomFieldInstance]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 927, - "column": 11, - "stop_line": 927, - "stop_column": 15, + "line": 930, + "column": 17, + "stop_line": 930, + "stop_column": 21, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `BasicUserSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `BasicUserSerializer.Meta` has type `type[BasicUserSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `BasicUserSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 935, - "column": 11, - "stop_line": 935, - "stop_column": 15, + "line": 938, + "column": 17, + "stop_line": 938, + "stop_column": 21, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `NotesSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `NotesSerializer.Meta` has type `type[NotesSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `NotesSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[Note]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[Note]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 1093, + "line": 1095, "column": 30, - "stop_line": 1093, + "stop_line": 1095, "stop_column": 55, "path": "src/documents/serialisers.py", "code": -2, @@ -1921,9 +1993,9 @@ "severity": "error" }, { - "line": 1137, + "line": 1139, "column": 12, - "stop_line": 1137, + "stop_line": 1139, "stop_column": 34, "path": "src/documents/serialisers.py", "code": -2, @@ -1933,9 +2005,9 @@ "severity": "error" }, { - "line": 1141, + "line": 1143, "column": 42, - "stop_line": 1141, + "stop_line": 1143, "stop_column": 64, "path": "src/documents/serialisers.py", "code": -2, @@ -1945,57 +2017,33 @@ "severity": "error" }, { - "line": 1224, - "column": 11, - "stop_line": 1224, - "stop_column": 15, + "line": 1227, + "column": 17, + "stop_line": 1227, + "stop_column": 25, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `DocumentSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `DocumentSerializer.Meta` has type `type[DocumentSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `DocumentSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[Document]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[Document]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 1224, - "column": 11, - "stop_line": 1224, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `DocumentSerializer.Meta` overrides parent class `NestedUpdateMixin` in an inconsistent manner\n `DocumentSerializer.Meta` has type `type[DocumentSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `NestedUpdateMixin.Meta`", - "concise_description": "Class member `DocumentSerializer.Meta` overrides parent class `NestedUpdateMixin` in an inconsistent manner", - "severity": "error" - }, - { - "line": 1224, - "column": 11, - "stop_line": 1224, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `DocumentSerializer.Meta` overrides parent class `DynamicFieldsModelSerializer` in an inconsistent manner\n `DocumentSerializer.Meta` has type `type[DocumentSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `DynamicFieldsModelSerializer.Meta`", - "concise_description": "Class member `DocumentSerializer.Meta` overrides parent class `DynamicFieldsModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 1260, + "line": 1262, "column": 9, - "stop_line": 1260, + "stop_line": 1262, "stop_column": 26, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-param-name-override", + "name": "bad-override-param-name", "description": "Class member `SearchResultListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner\n Got parameter name `hits`, expected `data`", "concise_description": "Class member `SearchResultListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 1263, + "line": 1265, "column": 21, - "stop_line": 1263, + "stop_line": 1265, "stop_column": 47, "path": "src/documents/serialisers.py", "code": -2, @@ -2004,18 +2052,6 @@ "concise_description": "Object of class `BaseSerializer` has no attribute `fetch_documents`\nObject of class `Field` has no attribute `fetch_documents`\nObject of class `NoneType` has no attribute `fetch_documents`", "severity": "error" }, - { - "line": 1264, - "column": 9, - "stop_line": 1264, - "stop_column": 27, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `context`", - "concise_description": "Object of class `NoneType` has no attribute `context`", - "severity": "error" - }, { "line": 1266, "column": 9, @@ -2029,9 +2065,21 @@ "severity": "error" }, { - "line": 1266, + "line": 1268, + "column": 9, + "stop_line": 1268, + "stop_column": 27, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `context`", + "concise_description": "Object of class `NoneType` has no attribute `context`", + "severity": "error" + }, + { + "line": 1268, "column": 51, - "stop_line": 1266, + "stop_line": 1268, "stop_column": 83, "path": "src/documents/serialisers.py", "code": -2, @@ -2041,57 +2089,57 @@ "severity": "error" }, { - "line": 1291, + "line": 1293, "column": 9, - "stop_line": 1291, + "stop_line": 1293, "stop_column": 26, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-param-name-override", + "name": "bad-override-param-name", "description": "Class member `SearchResultSerializer.to_representation` overrides parent class `DocumentSerializer` in an inconsistent manner\n Got parameter name `hit`, expected `instance`", "concise_description": "Class member `SearchResultSerializer.to_representation` overrides parent class `DocumentSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 1313, + "line": 1315, "column": 9, - "stop_line": 1313, + "stop_line": 1315, "stop_column": 30, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", + "name": "bad-override-mutable-attribute", "description": "Class member `Meta.list_serializer_class` overrides parent class `Meta` in an inconsistent manner\n `Meta.list_serializer_class` has type `type[SearchResultListSerializer]`, which is not consistent with `type[OwnedObjectListSerializer]` in `Meta.list_serializer_class` (the type of read-write attributes cannot be changed)", "concise_description": "Class member `Meta.list_serializer_class` overrides parent class `Meta` in an inconsistent manner", "severity": "error" }, { - "line": 1317, - "column": 11, - "stop_line": 1317, - "stop_column": 15, + "line": 1320, + "column": 17, + "stop_line": 1320, + "stop_column": 36, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `SavedViewFilterRuleSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `SavedViewFilterRuleSerializer.Meta` has type `type[SavedViewFilterRuleSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `SavedViewFilterRuleSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[SavedViewFilterRule]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[SavedViewFilterRule]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 1325, - "column": 11, - "stop_line": 1325, - "stop_column": 15, + "line": 1328, + "column": 17, + "stop_line": 1328, + "stop_column": 26, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `SavedViewSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `SavedViewSerializer.Meta` has type `type[SavedViewSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `SavedViewSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[SavedView]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[SavedView]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 1465, + "line": 1467, "column": 21, - "stop_line": 1465, + "stop_line": 1467, "stop_column": 62, "path": "src/documents/serialisers.py", "code": -2, @@ -2101,9 +2149,9 @@ "severity": "error" }, { - "line": 1467, + "line": 1469, "column": 36, - "stop_line": 1467, + "stop_line": 1469, "stop_column": 63, "path": "src/documents/serialisers.py", "code": -2, @@ -2113,9 +2161,21 @@ "severity": "error" }, { - "line": 2349, + "line": 1696, + "column": 7, + "stop_line": 1696, + "stop_column": 25, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "invalid-inheritance", + "description": "Class `BulkEditSerializer` has inconsistent type arguments for base class `Field`: `Field[Any, Any, Any, dict[str, Any]]` and `Field[Any, Any, Any, dict[str, list[int]]]`", + "concise_description": "Class `BulkEditSerializer` has inconsistent type arguments for base class `Field`: `Field[Any, Any, Any, dict[str, Any]]` and `Field[Any, Any, Any, dict[str, list[int]]]`", + "severity": "error" + }, + { + "line": 2356, "column": 73, - "stop_line": 2349, + "stop_line": 2356, "stop_column": 80, "path": "src/documents/serialisers.py", "code": -2, @@ -2125,45 +2185,33 @@ "severity": "error" }, { - "line": 2362, - "column": 11, - "stop_line": 2362, - "stop_column": 15, + "line": 2370, + "column": 17, + "stop_line": 2370, + "stop_column": 28, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `StoragePathSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner\n `StoragePathSerializer.Meta` has type `type[StoragePathSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `MatchingModelSerializer.Meta`", - "concise_description": "Class member `StoragePathSerializer.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[StoragePath]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[StoragePath]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 2362, - "column": 11, - "stop_line": 2362, - "stop_column": 15, + "line": 2418, + "column": 17, + "stop_line": 2418, + "stop_column": 27, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `StoragePathSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `StoragePathSerializer.Meta` has type `type[StoragePathSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `StoragePathSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[UiSettings]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[UiSettings]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 2407, - "column": 11, - "stop_line": 2407, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `UiSettingsViewSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `UiSettingsViewSerializer.Meta` has type `type[UiSettingsViewSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `UiSettingsViewSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 2424, + "line": 2434, "column": 9, - "stop_line": 2424, + "stop_line": 2434, "stop_column": 15, "path": "src/documents/serialisers.py", "code": -2, @@ -2173,141 +2221,153 @@ "severity": "error" }, { - "line": 2433, - "column": 11, - "stop_line": 2433, - "stop_column": 15, + "line": 2463, + "column": 17, + "stop_line": 2463, + "stop_column": 30, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `TasksViewSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `TasksViewSerializer.Meta` has type `type[TasksViewSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `TasksViewSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 2471, - "column": 30, - "stop_line": 2471, - "stop_column": 57, + "line": 2516, + "column": 17, + "stop_line": 2516, + "stop_column": 30, "path": "src/documents/serialisers.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `group`", - "concise_description": "Object of class `NoneType` has no attribute `group`", + "name": "bad-assignment", + "description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 2522, - "column": 11, - "stop_line": 2522, - "stop_column": 15, + "line": 2554, + "column": 46, + "stop_line": 2554, + "stop_column": 76, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `ShareLinkSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `ShareLinkSerializer.Meta` has type `type[ShareLinkSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `ShareLinkSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "no-matching-overload", + "description": "No matching overload found for function `dict.get` called with arguments: (str, str)\n Possible overloads:\n (key: PaperlessTask.TaskType, default: None = None, /) -> str | None\n (key: PaperlessTask.TaskType, default: str, /) -> str [closest match]\n (key: PaperlessTask.TaskType, default: _T, /) -> str | _T", + "concise_description": "No matching overload found for function `dict.get` called with arguments: (str, str)", "severity": "error" }, { - "line": 2567, - "column": 11, - "stop_line": 2567, - "stop_column": 15, + "line": 2570, + "column": 38, + "stop_line": 2570, + "stop_column": 70, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `ShareLinkBundleSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `ShareLinkBundleSerializer.Meta` has type `type[ShareLinkBundleSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `ShareLinkBundleSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "no-matching-overload", + "description": "No matching overload found for function `dict.get` called with arguments: (str, str)\n Possible overloads:\n (key: PaperlessTask.Status, default: None = None, /) -> str | None\n (key: PaperlessTask.Status, default: str, /) -> str [closest match]\n (key: PaperlessTask.Status, default: _T, /) -> str | _T", + "concise_description": "No matching overload found for function `dict.get` called with arguments: (str, str)", "severity": "error" }, { - "line": 2780, - "column": 11, - "stop_line": 2780, - "stop_column": 15, + "line": 2581, + "column": 51, + "stop_line": 2581, + "stop_column": 86, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `WorkflowTriggerSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `WorkflowTriggerSerializer.Meta` has type `type[WorkflowTriggerSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `WorkflowTriggerSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "no-matching-overload", + "description": "No matching overload found for function `dict.get` called with arguments: (str, Literal['manual_task'])\n Possible overloads:\n (key: PaperlessTask.TriggerSource, default: None = None, /) -> str | None\n (key: PaperlessTask.TriggerSource, default: str, /) -> str [closest match]\n (key: PaperlessTask.TriggerSource, default: _T, /) -> str | _T", + "concise_description": "No matching overload found for function `dict.get` called with arguments: (str, Literal['manual_task'])", "severity": "error" }, { - "line": 2876, - "column": 11, - "stop_line": 2876, - "stop_column": 15, + "line": 2659, + "column": 17, + "stop_line": 2659, + "stop_column": 26, "path": "src/documents/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `WorkflowActionEmailSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `WorkflowActionEmailSerializer.Meta` has type `type[WorkflowActionEmailSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `WorkflowActionEmailSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[ShareLink]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[ShareLink]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 2896, - "column": 11, - "stop_line": 2896, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `WorkflowActionWebhookSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `WorkflowActionWebhookSerializer.Meta` has type `type[WorkflowActionWebhookSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `WorkflowActionWebhookSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 2919, - "column": 11, - "stop_line": 2919, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `WorkflowActionSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `WorkflowActionSerializer.Meta` has type `type[WorkflowActionSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `WorkflowActionSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 3038, - "column": 11, - "stop_line": 3038, - "stop_column": 15, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `WorkflowSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `WorkflowSerializer.Meta` has type `type[WorkflowSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `WorkflowSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 3220, - "column": 16, - "stop_line": 3220, - "stop_column": 33, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowTrigger` has no attribute `workflows`", - "concise_description": "Object of class `WorkflowTrigger` has no attribute `workflows`", - "severity": "error" - }, - { - "line": 3224, - "column": 16, - "stop_line": 3224, + "line": 2704, + "column": 17, + "stop_line": 2704, "stop_column": 32, "path": "src/documents/serialisers.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `workflows`", - "concise_description": "Object of class `WorkflowAction` has no attribute `workflows`", + "name": "bad-assignment", + "description": "`type[ShareLinkBundle]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[ShareLinkBundle]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 3239, + "line": 2917, + "column": 17, + "stop_line": 2917, + "stop_column": 32, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`type[WorkflowTrigger]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[WorkflowTrigger]` is not assignable to attribute `model` with type `type[_MT]`", + "severity": "error" + }, + { + "line": 3013, + "column": 17, + "stop_line": 3013, + "stop_column": 36, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`type[WorkflowActionEmail]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[WorkflowActionEmail]` is not assignable to attribute `model` with type `type[_MT]`", + "severity": "error" + }, + { + "line": 3033, + "column": 17, + "stop_line": 3033, + "stop_column": 38, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`type[WorkflowActionWebhook]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[WorkflowActionWebhook]` is not assignable to attribute `model` with type `type[_MT]`", + "severity": "error" + }, + { + "line": 3056, + "column": 17, + "stop_line": 3056, + "stop_column": 31, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`type[WorkflowAction]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[WorkflowAction]` is not assignable to attribute `model` with type `type[_MT]`", + "severity": "error" + }, + { + "line": 3175, + "column": 17, + "stop_line": 3175, + "stop_column": 25, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`type[Workflow]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[Workflow]` is not assignable to attribute `model` with type `type[_MT]`", + "severity": "error" + }, + { + "line": 3375, "column": 52, - "stop_line": 3239, + "stop_line": 3375, "stop_column": 60, "path": "src/documents/serialisers.py", "code": -2, @@ -2317,9 +2377,9 @@ "severity": "error" }, { - "line": 3239, + "line": 3375, "column": 62, - "stop_line": 3239, + "stop_line": 3375, "stop_column": 69, "path": "src/documents/serialisers.py", "code": -2, @@ -2329,9 +2389,9 @@ "severity": "error" }, { - "line": 122, + "line": 124, "column": 72, - "stop_line": 122, + "stop_line": 124, "stop_column": 82, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2341,9 +2401,9 @@ "severity": "error" }, { - "line": 183, + "line": 185, "column": 72, - "stop_line": 183, + "stop_line": 185, "stop_column": 82, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2353,9 +2413,9 @@ "severity": "error" }, { - "line": 265, + "line": 267, "column": 50, - "stop_line": 265, + "stop_line": 267, "stop_column": 60, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2365,9 +2425,9 @@ "severity": "error" }, { - "line": 309, + "line": 311, "column": 70, - "stop_line": 309, + "stop_line": 311, "stop_column": 80, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2377,33 +2437,33 @@ "severity": "error" }, { - "line": 542, + "line": 544, "column": 46, - "stop_line": 542, + "stop_line": 544, "stop_column": 66, "path": "src/documents/signals/handlers.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 543, + "line": 545, "column": 49, - "stop_line": 543, + "stop_line": 545, "stop_column": 69, "path": "src/documents/signals/handlers.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 548, + "line": 550, "column": 28, - "stop_line": 548, + "stop_line": 550, "stop_column": 52, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2413,9 +2473,9 @@ "severity": "error" }, { - "line": 574, + "line": 576, "column": 43, - "stop_line": 574, + "stop_line": 576, "stop_column": 60, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2425,9 +2485,9 @@ "severity": "error" }, { - "line": 576, + "line": 578, "column": 51, - "stop_line": 576, + "stop_line": 578, "stop_column": 76, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2437,9 +2497,9 @@ "severity": "error" }, { - "line": 595, + "line": 597, "column": 21, - "stop_line": 595, + "stop_line": 597, "stop_column": 37, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2449,9 +2509,9 @@ "severity": "error" }, { - "line": 596, + "line": 598, "column": 21, - "stop_line": 596, + "stop_line": 598, "stop_column": 42, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2461,9 +2521,9 @@ "severity": "error" }, { - "line": 599, + "line": 601, "column": 46, - "stop_line": 599, + "stop_line": 601, "stop_column": 67, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2473,9 +2533,9 @@ "severity": "error" }, { - "line": 600, + "line": 602, "column": 28, - "stop_line": 600, + "stop_line": 602, "stop_column": 69, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2485,21 +2545,21 @@ "severity": "error" }, { - "line": 600, + "line": 602, "column": 29, - "stop_line": 600, + "stop_line": 602, "stop_column": 45, "path": "src/documents/signals/handlers.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", + "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", "severity": "error" }, { - "line": 620, + "line": 622, "column": 20, - "stop_line": 620, + "stop_line": 622, "stop_column": 33, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2509,9 +2569,9 @@ "severity": "error" }, { - "line": 622, + "line": 624, "column": 55, - "stop_line": 622, + "stop_line": 624, "stop_column": 70, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2521,9 +2581,9 @@ "severity": "error" }, { - "line": 624, + "line": 626, "column": 20, - "stop_line": 624, + "stop_line": 626, "stop_column": 32, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2533,9 +2593,9 @@ "severity": "error" }, { - "line": 624, + "line": 626, "column": 37, - "stop_line": 624, + "stop_line": 626, "stop_column": 66, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2545,9 +2605,9 @@ "severity": "error" }, { - "line": 626, + "line": 628, "column": 32, - "stop_line": 626, + "stop_line": 628, "stop_column": 73, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2557,21 +2617,21 @@ "severity": "error" }, { - "line": 626, + "line": 628, "column": 33, - "stop_line": 626, + "stop_line": 628, "stop_column": 54, "path": "src/documents/signals/handlers.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", + "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", "severity": "error" }, { - "line": 626, + "line": 628, "column": 56, - "stop_line": 626, + "stop_line": 628, "stop_column": 72, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2581,9 +2641,9 @@ "severity": "error" }, { - "line": 640, + "line": 642, "column": 33, - "stop_line": 640, + "stop_line": 642, "stop_column": 45, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2593,9 +2653,9 @@ "severity": "error" }, { - "line": 641, + "line": 643, "column": 41, - "stop_line": 641, + "stop_line": 643, "stop_column": 61, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2605,9 +2665,9 @@ "severity": "error" }, { - "line": 651, + "line": 653, "column": 49, - "stop_line": 651, + "stop_line": 653, "stop_column": 73, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2617,21 +2677,21 @@ "severity": "error" }, { - "line": 653, + "line": 655, "column": 22, - "stop_line": 653, + "stop_line": 655, "stop_column": 38, "path": "src/documents/signals/handlers.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 680, + "line": 682, "column": 23, - "stop_line": 680, + "stop_line": 682, "stop_column": 50, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2641,9 +2701,9 @@ "severity": "error" }, { - "line": 684, + "line": 686, "column": 5, - "stop_line": 684, + "stop_line": 686, "stop_column": 24, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2653,9 +2713,9 @@ "severity": "error" }, { - "line": 688, + "line": 690, "column": 24, - "stop_line": 688, + "stop_line": 690, "stop_column": 43, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2665,9 +2725,9 @@ "severity": "error" }, { - "line": 705, + "line": 707, "column": 13, - "stop_line": 705, + "stop_line": 707, "stop_column": 28, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2677,9 +2737,9 @@ "severity": "error" }, { - "line": 719, + "line": 721, "column": 12, - "stop_line": 719, + "stop_line": 721, "stop_column": 51, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2689,9 +2749,9 @@ "severity": "error" }, { - "line": 723, + "line": 725, "column": 13, - "stop_line": 723, + "stop_line": 725, "stop_column": 39, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2701,9 +2761,9 @@ "severity": "error" }, { - "line": 762, + "line": 764, "column": 27, - "stop_line": 762, + "stop_line": 764, "stop_column": 51, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2713,9 +2773,9 @@ "severity": "error" }, { - "line": 782, + "line": 784, "column": 17, - "stop_line": 782, + "stop_line": 784, "stop_column": 52, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2725,9 +2785,9 @@ "severity": "error" }, { - "line": 882, + "line": 884, "column": 13, - "stop_line": 882, + "stop_line": 884, "stop_column": 33, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2737,9 +2797,9 @@ "severity": "error" }, { - "line": 882, + "line": 884, "column": 60, - "stop_line": 882, + "stop_line": 884, "stop_column": 82, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2749,9 +2809,9 @@ "severity": "error" }, { - "line": 930, + "line": 931, "column": 29, - "stop_line": 930, + "stop_line": 931, "stop_column": 37, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2760,18 +2820,6 @@ "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_assignment_to_document`", "severity": "error" }, - { - "line": 931, - "column": 29, - "stop_line": 931, - "stop_column": 40, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "unbound-name", - "description": "`doc_tag_ids` may be uninitialized", - "concise_description": "`doc_tag_ids` may be uninitialized", - "severity": "error" - }, { "line": 938, "column": 59, @@ -2784,18 +2832,6 @@ "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_removal_to_document`", "severity": "error" }, - { - "line": 938, - "column": 69, - "stop_line": 938, - "stop_column": 80, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "unbound-name", - "description": "`doc_tag_ids` may be uninitialized", - "concise_description": "`doc_tag_ids` may be uninitialized", - "severity": "error" - }, { "line": 965, "column": 17, @@ -2833,81 +2869,21 @@ "severity": "error" }, { - "line": 985, - "column": 17, - "stop_line": 985, - "stop_column": 30, + "line": 1190, + "column": 49, + "stop_line": 1190, + "stop_column": 86, "path": "src/documents/signals/handlers.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `tags`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `tags`", + "name": "no-matching-overload", + "description": "No matching overload found for function `dict.get` called with arguments: (Unknown | None, Literal[PaperlessTask.Status.FAILURE])\n Possible overloads:\n (key: str, default: None = None, /) -> PaperlessTask.Status | None\n (key: str, default: PaperlessTask.Status, /) -> PaperlessTask.Status [closest match]\n (key: str, default: _T, /) -> PaperlessTask.Status | _T", + "concise_description": "No matching overload found for function `dict.get` called with arguments: (Unknown | None, Literal[PaperlessTask.Status.FAILURE])", "severity": "error" }, { - "line": 985, - "column": 35, - "stop_line": 985, - "stop_column": 46, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "unbound-name", - "description": "`doc_tag_ids` may be uninitialized", - "concise_description": "`doc_tag_ids` may be uninitialized", - "severity": "error" - }, - { - "line": 1013, - "column": 8, - "stop_line": 1013, - "stop_column": 29, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "not-iterable", - "description": "`not in` is not supported between `Literal['task']` and `None`", - "concise_description": "`not in` is not supported between `Literal['task']` and `None`", - "severity": "error" - }, - { - "line": 1013, - "column": 33, - "stop_line": 1013, - "stop_column": 48, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 1020, - "column": 21, - "stop_line": 1020, - "stop_column": 28, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 1028, - "column": 21, - "stop_line": 1028, - "stop_column": 34, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 1135, + "line": 1329, "column": 13, - "stop_line": 1135, + "stop_line": 1329, "stop_column": 28, "path": "src/documents/signals/handlers.py", "code": -2, @@ -2917,9 +2893,9 @@ "severity": "error" }, { - "line": 191, + "line": 174, "column": 21, - "stop_line": 191, + "stop_line": 174, "stop_column": 36, "path": "src/documents/tasks.py", "code": -2, @@ -2929,21 +2905,21 @@ "severity": "error" }, { - "line": 228, + "line": 218, "column": 16, - "stop_line": 228, + "stop_line": 218, "stop_column": 19, "path": "src/documents/tasks.py", "code": -2, - "name": "unbound-name", - "description": "`msg` may be uninitialized", - "concise_description": "`msg` may be uninitialized", + "name": "bad-return", + "description": "Returned type `str | None` is not assignable to declared return type `ConsumeFileDuplicateResult | ConsumeFileStoppedResult | ConsumeFileSuccessResult | None`", + "concise_description": "Returned type `str | None` is not assignable to declared return type `ConsumeFileDuplicateResult | ConsumeFileStoppedResult | ConsumeFileSuccessResult | None`", "severity": "error" }, { - "line": 331, + "line": 321, "column": 49, - "stop_line": 331, + "stop_line": 321, "stop_column": 74, "path": "src/documents/tasks.py", "code": -2, @@ -2953,9 +2929,9 @@ "severity": "error" }, { - "line": 347, + "line": 337, "column": 25, - "stop_line": 347, + "stop_line": 337, "stop_column": 52, "path": "src/documents/tasks.py", "code": -2, @@ -2965,9 +2941,9 @@ "severity": "error" }, { - "line": 371, + "line": 361, "column": 25, - "stop_line": 371, + "stop_line": 361, "stop_column": 52, "path": "src/documents/tasks.py", "code": -2, @@ -2977,9 +2953,9 @@ "severity": "error" }, { - "line": 384, + "line": 374, "column": 54, - "stop_line": 384, + "stop_line": 374, "stop_column": 75, "path": "src/documents/tasks.py", "code": -2, @@ -2989,9 +2965,9 @@ "severity": "error" }, { - "line": 385, + "line": 375, "column": 36, - "stop_line": 385, + "stop_line": 375, "stop_column": 86, "path": "src/documents/tasks.py", "code": -2, @@ -3001,21 +2977,21 @@ "severity": "error" }, { - "line": 385, + "line": 375, "column": 37, - "stop_line": 385, + "stop_line": 375, "stop_column": 62, "path": "src/documents/tasks.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", + "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", "severity": "error" }, { - "line": 562, + "line": 552, "column": 33, - "stop_line": 562, + "stop_line": 552, "stop_column": 61, "path": "src/documents/tasks.py", "code": -2, @@ -3097,10 +3073,22 @@ "severity": "error" }, { - "line": 135, + "line": 86, "column": 12, - "stop_line": 135, - "stop_column": 41, + "stop_line": 95, + "stop_column": 6, + "path": "src/documents/tests/conftest.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `DocumentFactory` is not assignable to declared return type `Document`", + "concise_description": "Returned type `DocumentFactory` is not assignable to declared return type `Document`", + "severity": "error" + }, + { + "line": 134, + "column": 12, + "stop_line": 134, + "stop_column": 49, "path": "src/documents/tests/conftest.py", "code": -2, "name": "missing-attribute", @@ -3108,78 +3096,6 @@ "concise_description": "Object of class `Manager` has no attribute `create_user`", "severity": "error" }, - { - "line": 19, - "column": 11, - "stop_line": 19, - "stop_column": 15, - "path": "src/documents/tests/factories.py", - "code": -2, - "name": "bad-override", - "description": "Class member `CorrespondentFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner\n `CorrespondentFactory.Meta` has type `type[CorrespondentFactory.Meta]`, which is not assignable to `type[DjangoModelFactory.Meta]`, the type of `DjangoModelFactory.Meta`", - "concise_description": "Class member `CorrespondentFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner", - "severity": "error" - }, - { - "line": 28, - "column": 11, - "stop_line": 28, - "stop_column": 15, - "path": "src/documents/tests/factories.py", - "code": -2, - "name": "bad-override", - "description": "Class member `DocumentTypeFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner\n `DocumentTypeFactory.Meta` has type `type[DocumentTypeFactory.Meta]`, which is not assignable to `type[DjangoModelFactory.Meta]`, the type of `DjangoModelFactory.Meta`", - "concise_description": "Class member `DocumentTypeFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner", - "severity": "error" - }, - { - "line": 37, - "column": 11, - "stop_line": 37, - "stop_column": 15, - "path": "src/documents/tests/factories.py", - "code": -2, - "name": "bad-override", - "description": "Class member `TagFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner\n `TagFactory.Meta` has type `type[TagFactory.Meta]`, which is not assignable to `type[DjangoModelFactory.Meta]`, the type of `DjangoModelFactory.Meta`", - "concise_description": "Class member `TagFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner", - "severity": "error" - }, - { - "line": 47, - "column": 11, - "stop_line": 47, - "stop_column": 15, - "path": "src/documents/tests/factories.py", - "code": -2, - "name": "bad-override", - "description": "Class member `StoragePathFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner\n `StoragePathFactory.Meta` has type `type[StoragePathFactory.Meta]`, which is not assignable to `type[DjangoModelFactory.Meta]`, the type of `DjangoModelFactory.Meta`", - "concise_description": "Class member `StoragePathFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner", - "severity": "error" - }, - { - "line": 59, - "column": 11, - "stop_line": 59, - "stop_column": 15, - "path": "src/documents/tests/factories.py", - "code": -2, - "name": "bad-override", - "description": "Class member `DocumentFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner\n `DocumentFactory.Meta` has type `type[DocumentFactory.Meta]`, which is not assignable to `type[DjangoModelFactory.Meta]`, the type of `DjangoModelFactory.Meta`", - "concise_description": "Class member `DocumentFactory.Meta` overrides parent class `DjangoModelFactory` in an inconsistent manner", - "severity": "error" - }, - { - "line": 97, - "column": 22, - "stop_line": 97, - "stop_column": 35, - "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, - "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", - "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", - "severity": "error" - }, { "line": 98, "column": 22, @@ -3188,20 +3104,20 @@ "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", - "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", + "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", + "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 109, + "line": 99, "column": 22, - "stop_line": 109, + "stop_line": 99, "stop_column": 35, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", - "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", + "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", + "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { @@ -3212,20 +3128,20 @@ "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", - "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", + "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", + "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 236, - "column": 26, - "stop_line": 236, - "stop_column": 39, + "line": 111, + "column": 22, + "stop_line": 111, + "stop_column": 35, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", - "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", + "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", + "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { @@ -3236,14 +3152,26 @@ "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, "name": "bad-assignment", + "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", + "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", + "severity": "error" + }, + { + "line": 238, + "column": 26, + "stop_line": 238, + "stop_column": 39, + "path": "src/documents/tests/management/test_management_base_cmd.py", + "code": -2, + "name": "bad-assignment", "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 246, + "line": 250, "column": 26, - "stop_line": 246, + "stop_line": 250, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3253,9 +3181,9 @@ "severity": "error" }, { - "line": 247, + "line": 251, "column": 26, - "stop_line": 247, + "stop_line": 251, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3265,9 +3193,9 @@ "severity": "error" }, { - "line": 267, + "line": 271, "column": 26, - "stop_line": 267, + "stop_line": 271, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3277,9 +3205,9 @@ "severity": "error" }, { - "line": 268, + "line": 272, "column": 26, - "stop_line": 268, + "stop_line": 272, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3289,9 +3217,9 @@ "severity": "error" }, { - "line": 288, + "line": 292, "column": 26, - "stop_line": 288, + "stop_line": 292, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3301,9 +3229,9 @@ "severity": "error" }, { - "line": 289, + "line": 293, "column": 26, - "stop_line": 289, + "stop_line": 293, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3313,9 +3241,9 @@ "severity": "error" }, { - "line": 298, + "line": 305, "column": 26, - "stop_line": 298, + "stop_line": 305, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3325,9 +3253,9 @@ "severity": "error" }, { - "line": 299, + "line": 306, "column": 26, - "stop_line": 299, + "stop_line": 306, "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", "code": -2, @@ -3337,39 +3265,27 @@ "severity": "error" }, { - "line": 485, - "column": 16, - "stop_line": 485, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", + "line": 196, + "column": 14, + "stop_line": 196, + "stop_column": 29, + "path": "src/documents/tests/management/test_management_sanity_checker.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", + "description": "Object of class `DocumentFactory` has no attribute `source_path`", + "concise_description": "Object of class `DocumentFactory` has no attribute `source_path`", "severity": "error" }, { - "line": 496, - "column": 16, - "stop_line": 496, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", + "line": 197, + "column": 14, + "stop_line": 197, + "stop_column": 32, + "path": "src/documents/tests/management/test_management_sanity_checker.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 507, - "column": 16, - "stop_line": 507, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", + "description": "Object of class `DocumentFactory` has no attribute `thumbnail_path`", + "concise_description": "Object of class `DocumentFactory` has no attribute `thumbnail_path`", "severity": "error" }, { @@ -3385,9 +3301,45 @@ "severity": "error" }, { - "line": 530, + "line": 529, "column": 16, - "stop_line": 530, + "stop_line": 529, + "stop_column": 66, + "path": "src/documents/tests/search/test_query.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `SearchResult` has no attribute `count`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", + "severity": "error" + }, + { + "line": 540, + "column": 16, + "stop_line": 540, + "stop_column": 66, + "path": "src/documents/tests/search/test_query.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `SearchResult` has no attribute `count`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", + "severity": "error" + }, + { + "line": 551, + "column": 16, + "stop_line": 551, + "stop_column": 66, + "path": "src/documents/tests/search/test_query.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `SearchResult` has no attribute `count`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", + "severity": "error" + }, + { + "line": 563, + "column": 16, + "stop_line": 563, "stop_column": 66, "path": "src/documents/tests/search/test_query.py", "code": -2, @@ -3505,153 +3457,57 @@ "severity": "error" }, { - "line": 94, - "column": 9, - "stop_line": 94, - "stop_column": 25, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_title`", - "concise_description": "Object of class `NoneType` has no attribute `app_title`", - "severity": "error" - }, - { - "line": 95, - "column": 9, - "stop_line": 95, - "stop_column": 24, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", - "severity": "error" - }, - { - "line": 96, - "column": 9, - "stop_line": 96, - "stop_column": 20, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 101, + "line": 195, "column": 30, - "stop_line": 101, - "stop_column": 46, + "stop_line": 195, + "stop_column": 43, "path": "src/documents/tests/test_api_app_config.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_title`", - "concise_description": "Object of class `NoneType` has no attribute `app_title`", + "description": "Object of class `NoneType` has no attribute `path`", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 102, - "column": 29, - "stop_line": 102, + "line": 208, + "column": 31, + "stop_line": 208, "stop_column": 44, "path": "src/documents/tests/test_api_app_config.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", + "description": "Object of class `NoneType` has no attribute `path`", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 128, - "column": 26, - "stop_line": 128, - "stop_column": 58, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `color_conversion_strategy`", - "concise_description": "Object of class `NoneType` has no attribute `color_conversion_strategy`", - "severity": "error" - }, - { - "line": 153, - "column": 26, - "stop_line": 153, - "stop_column": 42, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `user_args`", - "concise_description": "Object of class `NoneType` has no attribute `user_args`", - "severity": "error" - }, - { - "line": 154, - "column": 26, - "stop_line": 154, - "stop_column": 41, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `language`", - "concise_description": "Object of class `NoneType` has no attribute `language`", - "severity": "error" - }, - { - "line": 155, - "column": 26, - "stop_line": 155, - "stop_column": 52, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `barcode_tag_mapping`", - "concise_description": "Object of class `NoneType` has no attribute `barcode_tag_mapping`", - "severity": "error" - }, - { - "line": 190, - "column": 20, - "stop_line": 190, - "stop_column": 35, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", - "severity": "error" - }, - { - "line": 236, + "line": 241, "column": 25, - "stop_line": 236, - "stop_column": 40, + "stop_line": 241, + "stop_column": 45, "path": "src/documents/tests/test_api_app_config.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", + "description": "Object of class `NoneType` has no attribute `path`", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 271, + "line": 277, "column": 25, - "stop_line": 271, - "stop_column": 40, + "stop_line": 277, + "stop_column": 45, "path": "src/documents/tests/test_api_app_config.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", + "description": "Object of class `NoneType` has no attribute `path`", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 272, + "line": 278, "column": 27, - "stop_line": 272, + "stop_line": 278, "stop_column": 43, "path": "src/documents/tests/test_api_app_config.py", "code": -2, @@ -3660,102 +3516,6 @@ "concise_description": "Object of class `ImageFile` has no attribute `text`", "severity": "error" }, - { - "line": 789, - "column": 9, - "stop_line": 789, - "stop_column": 27, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `llm_api_key`", - "concise_description": "Object of class `NoneType` has no attribute `llm_api_key`", - "severity": "error" - }, - { - "line": 790, - "column": 9, - "stop_line": 790, - "stop_column": 20, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 803, - "column": 9, - "stop_line": 803, - "stop_column": 31, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `refresh_from_db`", - "concise_description": "Object of class `NoneType` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 804, - "column": 26, - "stop_line": 804, - "stop_column": 44, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `llm_api_key`", - "concise_description": "Object of class `NoneType` has no attribute `llm_api_key`", - "severity": "error" - }, - { - "line": 816, - "column": 9, - "stop_line": 816, - "stop_column": 31, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `refresh_from_db`", - "concise_description": "Object of class `NoneType` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 829, - "column": 9, - "stop_line": 829, - "stop_column": 26, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `ai_enabled`", - "concise_description": "Object of class `NoneType` has no attribute `ai_enabled`", - "severity": "error" - }, - { - "line": 830, - "column": 9, - "stop_line": 830, - "stop_column": 37, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `llm_embedding_backend`", - "concise_description": "Object of class `NoneType` has no attribute `llm_embedding_backend`", - "severity": "error" - }, - { - "line": 831, - "column": 9, - "stop_line": 831, - "stop_column": 20, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, { "line": 57, "column": 20, @@ -3770,9 +3530,9 @@ }, { "line": 279, - "column": 26, + "column": 17, "stop_line": 279, - "stop_column": 43, + "stop_column": 34, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -3781,9 +3541,9 @@ "severity": "error" }, { - "line": 529, + "line": 531, "column": 30, - "stop_line": 529, + "stop_line": 531, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3793,10 +3553,10 @@ "severity": "error" }, { - "line": 570, - "column": 26, - "stop_line": 570, - "stop_column": 43, + "line": 572, + "column": 17, + "stop_line": 572, + "stop_column": 34, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -3805,10 +3565,10 @@ "severity": "error" }, { - "line": 587, - "column": 26, - "stop_line": 587, - "stop_column": 43, + "line": 591, + "column": 17, + "stop_line": 591, + "stop_column": 34, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -3817,9 +3577,9 @@ "severity": "error" }, { - "line": 635, + "line": 641, "column": 30, - "stop_line": 635, + "stop_line": 641, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3829,9 +3589,9 @@ "severity": "error" }, { - "line": 652, + "line": 658, "column": 30, - "stop_line": 652, + "stop_line": 658, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3841,10 +3601,10 @@ "severity": "error" }, { - "line": 653, - "column": 26, - "stop_line": 653, - "stop_column": 43, + "line": 659, + "column": 17, + "stop_line": 659, + "stop_column": 34, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -3853,9 +3613,9 @@ "severity": "error" }, { - "line": 694, + "line": 702, "column": 30, - "stop_line": 694, + "stop_line": 702, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3865,9 +3625,9 @@ "severity": "error" }, { - "line": 734, + "line": 742, "column": 38, - "stop_line": 734, + "stop_line": 742, "stop_column": 55, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3877,9 +3637,9 @@ "severity": "error" }, { - "line": 786, + "line": 794, "column": 30, - "stop_line": 786, + "stop_line": 794, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3889,9 +3649,9 @@ "severity": "error" }, { - "line": 857, + "line": 865, "column": 30, - "stop_line": 857, + "stop_line": 865, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3901,9 +3661,9 @@ "severity": "error" }, { - "line": 892, + "line": 900, "column": 30, - "stop_line": 892, + "stop_line": 900, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3913,9 +3673,9 @@ "severity": "error" }, { - "line": 933, + "line": 941, "column": 30, - "stop_line": 933, + "stop_line": 941, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3925,9 +3685,9 @@ "severity": "error" }, { - "line": 970, + "line": 978, "column": 30, - "stop_line": 970, + "stop_line": 978, "stop_column": 47, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -3937,10 +3697,10 @@ "severity": "error" }, { - "line": 1065, - "column": 26, - "stop_line": 1065, - "stop_column": 44, + "line": 1073, + "column": 17, + "stop_line": 1073, + "stop_column": 35, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -3949,10 +3709,10 @@ "severity": "error" }, { - "line": 1066, - "column": 26, - "stop_line": 1066, - "stop_column": 44, + "line": 1076, + "column": 17, + "stop_line": 1076, + "stop_column": 35, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -3961,10 +3721,10 @@ "severity": "error" }, { - "line": 1067, - "column": 26, - "stop_line": 1067, - "stop_column": 44, + "line": 1079, + "column": 17, + "stop_line": 1079, + "stop_column": 35, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -3973,70 +3733,10 @@ "severity": "error" }, { - "line": 1084, - "column": 26, - "stop_line": 1084, - "stop_column": 44, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1101, - "column": 26, - "stop_line": 1101, - "stop_column": 44, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1102, - "column": 26, - "stop_line": 1102, - "stop_column": 44, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1103, - "column": 26, - "stop_line": 1103, - "stop_column": 44, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1115, - "column": 26, - "stop_line": 1115, - "stop_column": 44, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1116, - "column": 26, - "stop_line": 1116, - "stop_column": 44, + "line": 1098, + "column": 17, + "stop_line": 1098, + "stop_column": 35, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -4046,9 +3746,9 @@ }, { "line": 1117, - "column": 26, + "column": 17, "stop_line": 1117, - "stop_column": 44, + "stop_column": 35, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -4057,10 +3757,10 @@ "severity": "error" }, { - "line": 1142, - "column": 26, - "stop_line": 1142, - "stop_column": 44, + "line": 1120, + "column": 18, + "stop_line": 1120, + "stop_column": 36, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, "name": "missing-attribute", @@ -4069,9 +3769,69 @@ "severity": "error" }, { - "line": 1236, + "line": 1123, + "column": 18, + "stop_line": 1123, + "stop_column": 36, + "path": "src/documents/tests/test_api_custom_fields.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 1137, + "column": 18, + "stop_line": 1137, + "stop_column": 36, + "path": "src/documents/tests/test_api_custom_fields.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 1140, + "column": 18, + "stop_line": 1140, + "stop_column": 36, + "path": "src/documents/tests/test_api_custom_fields.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 1143, + "column": 18, + "stop_line": 1143, + "stop_column": 36, + "path": "src/documents/tests/test_api_custom_fields.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 1170, + "column": 18, + "stop_line": 1170, + "stop_column": 36, + "path": "src/documents/tests/test_api_custom_fields.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 1266, "column": 13, - "stop_line": 1236, + "stop_line": 1266, "stop_column": 37, "path": "src/documents/tests/test_api_custom_fields.py", "code": -2, @@ -4136,7 +3896,7 @@ "path": "src/documents/tests/test_api_documents.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, @@ -4148,14 +3908,14 @@ "path": "src/documents/tests/test_api_documents.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 1435, + "line": 1468, "column": 13, - "stop_line": 1435, + "stop_line": 1468, "stop_column": 20, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4165,9 +3925,9 @@ "severity": "error" }, { - "line": 1713, + "line": 1732, "column": 31, - "stop_line": 1713, + "stop_line": 1732, "stop_column": 48, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4177,9 +3937,9 @@ "severity": "error" }, { - "line": 1868, + "line": 1879, "column": 9, - "stop_line": 1868, + "stop_line": 1879, "stop_column": 25, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4189,9 +3949,9 @@ "severity": "error" }, { - "line": 2056, + "line": 2063, "column": 20, - "stop_line": 2056, + "stop_line": 2063, "stop_column": 52, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4201,9 +3961,9 @@ "severity": "error" }, { - "line": 2549, + "line": 2556, "column": 31, - "stop_line": 2549, + "stop_line": 2556, "stop_column": 52, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4213,9 +3973,9 @@ "severity": "error" }, { - "line": 2569, + "line": 2576, "column": 31, - "stop_line": 2569, + "stop_line": 2576, "stop_column": 52, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4225,9 +3985,9 @@ "severity": "error" }, { - "line": 2587, + "line": 2594, "column": 26, - "stop_line": 2587, + "stop_line": 2594, "stop_column": 41, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4237,9 +3997,9 @@ "severity": "error" }, { - "line": 2599, + "line": 2606, "column": 26, - "stop_line": 2599, + "stop_line": 2606, "stop_column": 41, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4249,9 +4009,9 @@ "severity": "error" }, { - "line": 2607, + "line": 2614, "column": 26, - "stop_line": 2607, + "stop_line": 2614, "stop_column": 41, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4261,9 +4021,9 @@ "severity": "error" }, { - "line": 2608, + "line": 2615, "column": 26, - "stop_line": 2608, + "stop_line": 2615, "stop_column": 41, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4273,9 +4033,9 @@ "severity": "error" }, { - "line": 2616, + "line": 2623, "column": 26, - "stop_line": 2616, + "stop_line": 2623, "stop_column": 41, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4285,9 +4045,9 @@ "severity": "error" }, { - "line": 2968, + "line": 2975, "column": 27, - "stop_line": 2968, + "stop_line": 2975, "stop_column": 39, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4297,9 +4057,9 @@ "severity": "error" }, { - "line": 2969, + "line": 2976, "column": 33, - "stop_line": 2969, + "stop_line": 2976, "stop_column": 51, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4309,9 +4069,9 @@ "severity": "error" }, { - "line": 2970, + "line": 2977, "column": 35, - "stop_line": 2970, + "stop_line": 2977, "stop_column": 55, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4321,9 +4081,9 @@ "severity": "error" }, { - "line": 2971, + "line": 2978, "column": 34, - "stop_line": 2971, + "stop_line": 2978, "stop_column": 53, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4333,9 +4093,9 @@ "severity": "error" }, { - "line": 3598, + "line": 3676, "column": 20, - "stop_line": 3598, + "stop_line": 3676, "stop_column": 52, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4345,9 +4105,9 @@ "severity": "error" }, { - "line": 3938, + "line": 4016, "column": 23, - "stop_line": 3938, + "stop_line": 4016, "stop_column": 50, "path": "src/documents/tests/test_api_documents.py", "code": -2, @@ -4381,9 +4141,9 @@ "severity": "error" }, { - "line": 25, + "line": 27, "column": 16, - "stop_line": 25, + "stop_line": 27, "stop_column": 44, "path": "src/documents/tests/test_api_filter_by_custom_fields.py", "code": -2, @@ -4393,9 +4153,9 @@ "severity": "error" }, { - "line": 28, + "line": 30, "column": 16, - "stop_line": 28, + "stop_line": 30, "stop_column": 44, "path": "src/documents/tests/test_api_filter_by_custom_fields.py", "code": -2, @@ -4404,6 +4164,18 @@ "concise_description": "Object of class `Document` has no attribute `custom_fields`", "severity": "error" }, + { + "line": 528, + "column": 16, + "stop_line": 528, + "stop_column": 39, + "path": "src/documents/tests/test_api_filter_by_custom_fields.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `SavedView` has no attribute `filter_rules`", + "concise_description": "Object of class `SavedView` has no attribute `filter_rules`", + "severity": "error" + }, { "line": 222, "column": 26, @@ -4548,6 +4320,438 @@ "concise_description": "Object of class `User` has no attribute `socialaccount_set`", "severity": "error" }, + { + "line": 83, + "column": 14, + "stop_line": 83, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 90, + "column": 14, + "stop_line": 90, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 96, + "column": 21, + "stop_line": 96, + "stop_column": 45, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 107, + "column": 14, + "stop_line": 107, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 119, + "column": 14, + "stop_line": 119, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 126, + "column": 14, + "stop_line": 126, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 132, + "column": 34, + "stop_line": 132, + "stop_column": 58, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 144, + "column": 17, + "stop_line": 144, + "stop_column": 41, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 155, + "column": 17, + "stop_line": 155, + "stop_column": 41, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 160, + "column": 26, + "stop_line": 160, + "stop_column": 50, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 190, + "column": 14, + "stop_line": 190, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 200, + "column": 14, + "stop_line": 200, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 217, + "column": 14, + "stop_line": 217, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 222, + "column": 20, + "stop_line": 222, + "stop_column": 44, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 251, + "column": 14, + "stop_line": 251, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 257, + "column": 14, + "stop_line": 257, + "stop_column": 33, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 262, + "column": 21, + "stop_line": 262, + "stop_column": 45, + "path": "src/documents/tests/test_api_schema.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "line": 1647, + "column": 25, + "stop_line": 1647, + "stop_column": 58, + "path": "src/documents/tests/test_api_search.py", + "code": -2, + "name": "unsupported-operation", + "description": "`<` is not supported between `int` and `None`\n Argument `None` is not assignable to parameter `value` with type `int` in function `int.__lt__`", + "concise_description": "`<` is not supported between `int` and `None`", + "severity": "error" + }, + { + "line": 1647, + "column": 25, + "stop_line": 1647, + "stop_column": 58, + "path": "src/documents/tests/test_api_search.py", + "code": -2, + "name": "unsupported-operation", + "description": "`<` is not supported between `None` and `int`\n Argument `None` is not assignable to parameter `value` with type `int` in function `int.__gt__`", + "concise_description": "`<` is not supported between `None` and `int`", + "severity": "error" + }, + { + "line": 1647, + "column": 25, + "stop_line": 1647, + "stop_column": 58, + "path": "src/documents/tests/test_api_search.py", + "code": -2, + "name": "unsupported-operation", + "description": "`<` is not supported between `None` and `None`\n Cannot find `__lt__` or `__gt__`", + "concise_description": "`<` is not supported between `None` and `None`", + "severity": "error" + }, + { + "line": 1647, + "column": 28, + "stop_line": 1647, + "stop_column": 40, + "path": "src/documents/tests/test_api_search.py", + "code": -2, + "name": "bad-specialization", + "description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", + "concise_description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", + "severity": "error" + }, + { + "line": 1647, + "column": 46, + "stop_line": 1647, + "stop_column": 58, + "path": "src/documents/tests/test_api_search.py", + "code": -2, + "name": "bad-specialization", + "description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", + "concise_description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", + "severity": "error" + }, + { + "line": 106, + "column": 47, + "stop_line": 106, + "stop_column": 72, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `dict[str, Faker]` is not assignable to parameter `data` with type `Iterable[tuple[str, Iterable[bytes | float | str] | bytes | float | str]] | Mapping[str, Iterable[bytes | float | str] | bytes | float | str] | None` in function `rest_framework.test.APIClient.get`", + "concise_description": "Argument `dict[str, Faker]` is not assignable to parameter `data` with type `Iterable[tuple[str, Iterable[bytes | float | str] | bytes | float | str]] | Mapping[str, Iterable[bytes | float | str] | bytes | float | str] | None` in function `rest_framework.test.APIClient.get`", + "severity": "error" + }, + { + "line": 491, + "column": 24, + "stop_line": 491, + "stop_column": 32, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 491, + "column": 34, + "stop_line": 491, + "stop_column": 42, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 506, + "column": 24, + "stop_line": 506, + "stop_column": 31, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 521, + "column": 24, + "stop_line": 521, + "stop_column": 31, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 541, + "column": 24, + "stop_line": 541, + "stop_column": 31, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 584, + "column": 41, + "stop_line": 584, + "stop_column": 52, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `pk`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 825, + "column": 42, + "stop_line": 825, + "stop_column": 48, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `pk`", + "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 833, + "column": 34, + "stop_line": 833, + "stop_column": 40, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `pk`", + "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 845, + "column": 42, + "stop_line": 845, + "stop_column": 48, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `pk`", + "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 864, + "column": 42, + "stop_line": 864, + "stop_column": 48, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `pk`", + "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 880, + "column": 52, + "stop_line": 880, + "stop_column": 55, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "concise_description": "Argument `DocumentFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "severity": "error" + }, + { + "line": 884, + "column": 42, + "stop_line": 884, + "stop_column": 48, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `pk`", + "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 892, + "column": 34, + "stop_line": 892, + "stop_column": 40, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `pk`", + "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", + "severity": "error" + }, { "line": 83, "column": 23, @@ -4572,282 +4776,6 @@ "concise_description": "Object of class `NoneType` has no attribute `pk`", "severity": "error" }, - { - "line": 243, - "column": 17, - "stop_line": 243, - "stop_column": 40, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_tags`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_tags`", - "severity": "error" - }, - { - "line": 247, - "column": 17, - "stop_line": 247, - "stop_column": 44, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_all_tags`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_all_tags`", - "severity": "error" - }, - { - "line": 251, - "column": 17, - "stop_line": 251, - "stop_column": 44, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_tags`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_tags`", - "severity": "error" - }, - { - "line": 255, - "column": 17, - "stop_line": 255, - "stop_column": 54, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_any_correspondents`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_any_correspondents`", - "severity": "error" - }, - { - "line": 259, - "column": 17, - "stop_line": 259, - "stop_column": 54, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_correspondents`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_correspondents`", - "severity": "error" - }, - { - "line": 263, - "column": 17, - "stop_line": 263, - "stop_column": 54, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_any_document_types`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_any_document_types`", - "severity": "error" - }, - { - "line": 267, - "column": 17, - "stop_line": 267, - "stop_column": 54, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_document_types`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_document_types`", - "severity": "error" - }, - { - "line": 271, - "column": 17, - "stop_line": 271, - "stop_column": 53, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_any_storage_paths`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_any_storage_paths`", - "severity": "error" - }, - { - "line": 275, - "column": 17, - "stop_line": 275, - "stop_column": 53, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_storage_paths`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_storage_paths`", - "severity": "error" - }, - { - "line": 279, - "column": 13, - "stop_line": 279, - "stop_column": 46, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_custom_field_query`", - "concise_description": "Object of class `NoneType` has no attribute `filter_custom_field_query`", - "severity": "error" - }, - { - "line": 462, - "column": 26, - "stop_line": 462, - "stop_column": 67, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_tags`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_tags`", - "severity": "error" - }, - { - "line": 464, - "column": 13, - "stop_line": 464, - "stop_column": 58, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_all_tags`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_all_tags`", - "severity": "error" - }, - { - "line": 468, - "column": 13, - "stop_line": 468, - "stop_column": 58, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_tags`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_tags`", - "severity": "error" - }, - { - "line": 472, - "column": 13, - "stop_line": 472, - "stop_column": 68, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_any_correspondents`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_any_correspondents`", - "severity": "error" - }, - { - "line": 476, - "column": 13, - "stop_line": 476, - "stop_column": 68, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_correspondents`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_correspondents`", - "severity": "error" - }, - { - "line": 480, - "column": 13, - "stop_line": 480, - "stop_column": 68, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_any_document_types`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_any_document_types`", - "severity": "error" - }, - { - "line": 484, - "column": 13, - "stop_line": 484, - "stop_column": 68, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_document_types`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_document_types`", - "severity": "error" - }, - { - "line": 488, - "column": 13, - "stop_line": 488, - "stop_column": 67, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_any_storage_paths`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_any_storage_paths`", - "severity": "error" - }, - { - "line": 492, - "column": 13, - "stop_line": 492, - "stop_column": 67, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_has_not_storage_paths`", - "concise_description": "Object of class `NoneType` has no attribute `filter_has_not_storage_paths`", - "severity": "error" - }, - { - "line": 496, - "column": 13, - "stop_line": 496, - "stop_column": 64, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filter_custom_field_query`", - "concise_description": "Object of class `NoneType` has no attribute `filter_custom_field_query`", - "severity": "error" - }, - { - "line": 499, - "column": 26, - "stop_line": 499, - "stop_column": 63, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `assign_title`", - "concise_description": "Object of class `NoneType` has no attribute `assign_title`", - "severity": "error" - }, - { - "line": 581, - "column": 29, - "stop_line": 581, - "stop_column": 57, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `id`", - "concise_description": "Object of class `NoneType` has no attribute `id`", - "severity": "error" - }, - { - "line": 583, - "column": 29, - "stop_line": 583, - "stop_column": 56, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `id`", - "concise_description": "Object of class `NoneType` has no attribute `id`", - "severity": "error" - }, { "line": 34, "column": 13, @@ -4873,45 +4801,9 @@ "severity": "error" }, { - "line": 588, - "column": 9, - "stop_line": 588, - "stop_column": 36, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `barcodes_enabled`", - "concise_description": "Object of class `NoneType` has no attribute `barcodes_enabled`", - "severity": "error" - }, - { - "line": 589, - "column": 9, - "stop_line": 589, - "stop_column": 34, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `barcode_string`", - "concise_description": "Object of class `NoneType` has no attribute `barcode_string`", - "severity": "error" - }, - { - "line": 590, - "column": 9, - "stop_line": 590, - "stop_column": 24, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 621, + "line": 622, "column": 21, - "stop_line": 621, + "stop_line": 622, "stop_column": 42, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -4921,9 +4813,9 @@ "severity": "error" }, { - "line": 657, + "line": 658, "column": 5, - "stop_line": 657, + "stop_line": 658, "stop_column": 20, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -4933,9 +4825,9 @@ "severity": "error" }, { - "line": 658, + "line": 659, "column": 45, - "stop_line": 658, + "stop_line": 659, "stop_column": 58, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -4945,9 +4837,9 @@ "severity": "error" }, { - "line": 662, + "line": 663, "column": 13, - "stop_line": 662, + "stop_line": 663, "stop_column": 54, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -4957,9 +4849,9 @@ "severity": "error" }, { - "line": 663, + "line": 664, "column": 13, - "stop_line": 663, + "stop_line": 664, "stop_column": 34, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -4969,21 +4861,9 @@ "severity": "error" }, { - "line": 775, - "column": 30, - "stop_line": 775, - "stop_column": 60, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `archive_serial_number`", - "concise_description": "Object of class `NoneType` has no attribute `archive_serial_number`", - "severity": "error" - }, - { - "line": 815, + "line": 817, "column": 5, - "stop_line": 815, + "stop_line": 817, "stop_column": 20, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -4993,9 +4873,9 @@ "severity": "error" }, { - "line": 816, + "line": 818, "column": 45, - "stop_line": 816, + "stop_line": 818, "stop_column": 58, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -5005,9 +4885,9 @@ "severity": "error" }, { - "line": 820, + "line": 822, "column": 13, - "stop_line": 820, + "stop_line": 822, "stop_column": 54, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -5017,9 +4897,9 @@ "severity": "error" }, { - "line": 821, + "line": 823, "column": 13, - "stop_line": 821, + "stop_line": 823, "stop_column": 34, "path": "src/documents/tests/test_barcodes.py", "code": -2, @@ -5028,30 +4908,6 @@ "concise_description": "Class `dirs` has no class attribute `scratch_dir`", "severity": "error" }, - { - "line": 1062, - "column": 30, - "stop_line": 1062, - "stop_column": 52, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `name`", - "concise_description": "Object of class `NoneType` has no attribute `name`", - "severity": "error" - }, - { - "line": 1066, - "column": 30, - "stop_line": 1066, - "stop_column": 52, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `name`", - "concise_description": "Object of class `NoneType` has no attribute `name`", - "severity": "error" - }, { "line": 73, "column": 13, @@ -5221,10 +5077,10 @@ "severity": "error" }, { - "line": 323, - "column": 13, - "stop_line": 323, - "stop_column": 36, + "line": 322, + "column": 17, + "stop_line": 322, + "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, "name": "missing-attribute", @@ -5234,9 +5090,9 @@ }, { "line": 339, - "column": 13, + "column": 17, "stop_line": 339, - "stop_column": 36, + "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, "name": "missing-attribute", @@ -5245,10 +5101,10 @@ "severity": "error" }, { - "line": 343, - "column": 13, - "stop_line": 343, - "stop_column": 36, + "line": 342, + "column": 17, + "stop_line": 342, + "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, "name": "missing-attribute", @@ -5257,10 +5113,10 @@ "severity": "error" }, { - "line": 367, - "column": 13, - "stop_line": 367, - "stop_column": 36, + "line": 366, + "column": 17, + "stop_line": 366, + "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, "name": "missing-attribute", @@ -5269,10 +5125,10 @@ "severity": "error" }, { - "line": 371, - "column": 13, - "stop_line": 371, - "stop_column": 36, + "line": 369, + "column": 17, + "stop_line": 369, + "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, "name": "missing-attribute", @@ -5281,9 +5137,9 @@ "severity": "error" }, { - "line": 462, + "line": 460, "column": 48, - "stop_line": 462, + "stop_line": 460, "stop_column": 50, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5293,9 +5149,9 @@ "severity": "error" }, { - "line": 468, + "line": 466, "column": 26, - "stop_line": 468, + "stop_line": 466, "stop_column": 49, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5305,9 +5161,9 @@ "severity": "error" }, { - "line": 506, + "line": 504, "column": 48, - "stop_line": 506, + "stop_line": 504, "stop_column": 50, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5317,9 +5173,9 @@ "severity": "error" }, { - "line": 512, + "line": 510, "column": 26, - "stop_line": 512, + "stop_line": 510, "stop_column": 49, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5329,9 +5185,9 @@ "severity": "error" }, { - "line": 527, + "line": 525, "column": 19, - "stop_line": 527, + "stop_line": 525, "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5341,9 +5197,9 @@ "severity": "error" }, { - "line": 536, + "line": 534, "column": 27, - "stop_line": 536, + "stop_line": 534, "stop_column": 48, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5353,9 +5209,9 @@ "severity": "error" }, { - "line": 545, + "line": 543, "column": 19, - "stop_line": 545, + "stop_line": 543, "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5365,9 +5221,9 @@ "severity": "error" }, { - "line": 554, + "line": 552, "column": 27, - "stop_line": 554, + "stop_line": 552, "stop_column": 48, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5377,9 +5233,9 @@ "severity": "error" }, { - "line": 563, + "line": 561, "column": 19, - "stop_line": 563, + "stop_line": 561, "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5389,9 +5245,9 @@ "severity": "error" }, { - "line": 596, + "line": 594, "column": 19, - "stop_line": 596, + "stop_line": 594, "stop_column": 40, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5401,9 +5257,9 @@ "severity": "error" }, { - "line": 601, + "line": 599, "column": 27, - "stop_line": 601, + "stop_line": 599, "stop_column": 48, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5413,9 +5269,9 @@ "severity": "error" }, { - "line": 670, + "line": 668, "column": 24, - "stop_line": 670, + "stop_line": 668, "stop_column": 45, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5425,9 +5281,9 @@ "severity": "error" }, { - "line": 907, + "line": 904, "column": 24, - "stop_line": 907, + "stop_line": 904, "stop_column": 45, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5437,9 +5293,9 @@ "severity": "error" }, { - "line": 1447, + "line": 1449, "column": 20, - "stop_line": 1447, + "stop_line": 1449, "stop_column": 41, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5449,9 +5305,9 @@ "severity": "error" }, { - "line": 1523, + "line": 1525, "column": 20, - "stop_line": 1523, + "stop_line": 1525, "stop_column": 41, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5461,9 +5317,9 @@ "severity": "error" }, { - "line": 1581, + "line": 1585, "column": 20, - "stop_line": 1581, + "stop_line": 1585, "stop_column": 41, "path": "src/documents/tests/test_bulk_edit.py", "code": -2, @@ -5581,21 +5437,21 @@ "severity": "error" }, { - "line": 266, + "line": 267, "column": 27, - "stop_line": 266, + "stop_line": 267, "stop_column": 48, "path": "src/documents/tests/test_consumer.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { - "line": 290, + "line": 291, "column": 28, - "stop_line": 290, + "stop_line": 291, "stop_column": 49, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5605,9 +5461,9 @@ "severity": "error" }, { - "line": 353, + "line": 358, "column": 26, - "stop_line": 353, + "stop_line": 358, "stop_column": 51, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5617,213 +5473,69 @@ "severity": "error" }, { - "line": 367, + "line": 373, "column": 26, - "stop_line": 367, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 381, - "column": 26, - "stop_line": 381, - "stop_column": 47, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 397, - "column": 27, - "stop_line": 397, - "stop_column": 40, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 398, - "column": 30, - "stop_line": 398, - "stop_column": 43, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 399, - "column": 27, - "stop_line": 399, - "stop_column": 40, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 424, - "column": 56, - "stop_line": 424, - "stop_column": 78, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 429, - "column": 26, - "stop_line": 429, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 431, - "column": 13, - "stop_line": 431, - "stop_column": 35, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 445, - "column": 26, - "stop_line": 445, - "stop_column": 56, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `archive_serial_number`", - "concise_description": "Object of class `NoneType` has no attribute `archive_serial_number`", - "severity": "error" - }, - { - "line": 465, - "column": 26, - "stop_line": 465, - "stop_column": 40, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 479, - "column": 26, - "stop_line": 479, - "stop_column": 40, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 498, - "column": 64, - "stop_line": 498, - "stop_column": 72, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", - "severity": "error" - }, - { - "line": 500, - "column": 65, - "stop_line": 500, - "stop_column": 73, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", - "severity": "error" - }, - { - "line": 568, - "column": 13, - "stop_line": 568, - "stop_column": 28, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `delete`", - "concise_description": "Object of class `NoneType` has no attribute `delete`", - "severity": "error" - }, - { - "line": 649, - "column": 26, - "stop_line": 649, - "stop_column": 40, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 650, - "column": 26, - "stop_line": 650, - "stop_column": 43, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filename`", - "concise_description": "Object of class `NoneType` has no attribute `filename`", - "severity": "error" - }, - { - "line": 651, - "column": 26, - "stop_line": 651, + "stop_line": 373, "stop_column": 51, "path": "src/documents/tests/test_consumer.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `archive_filename`", - "concise_description": "Object of class `NoneType` has no attribute `archive_filename`", + "description": "Object of class `NoneType` has no attribute `id`", + "concise_description": "Object of class `NoneType` has no attribute `id`", "severity": "error" }, { - "line": 673, + "line": 388, + "column": 26, + "stop_line": 388, + "stop_column": 50, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `id`", + "concise_description": "Object of class `NoneType` has no attribute `id`", + "severity": "error" + }, + { + "line": 433, + "column": 56, + "stop_line": 433, + "stop_column": 78, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 438, + "column": 26, + "stop_line": 438, + "stop_column": 48, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 440, + "column": 13, + "stop_line": 440, + "stop_column": 35, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 689, "column": 34, - "stop_line": 673, + "stop_line": 689, "stop_column": 51, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5833,9 +5545,9 @@ "severity": "error" }, { - "line": 675, + "line": 691, "column": 17, - "stop_line": 675, + "stop_line": 691, "stop_column": 42, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5845,57 +5557,33 @@ "severity": "error" }, { - "line": 679, + "line": 695, "column": 27, - "stop_line": 679, + "stop_line": 695, "stop_column": 48, "path": "src/documents/tests/test_consumer.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { - "line": 708, - "column": 26, - "stop_line": 708, - "stop_column": 40, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 710, + "line": 728, "column": 27, - "stop_line": 710, - "stop_column": 47, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `source_path`", - "concise_description": "Object of class `NoneType` has no attribute `source_path`", - "severity": "error" - }, - { - "line": 711, - "column": 27, - "stop_line": 711, + "stop_line": 728, "stop_column": 48, "path": "src/documents/tests/test_consumer.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `archive_path`", - "concise_description": "Object of class `NoneType` has no attribute `archive_path`", + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { - "line": 773, + "line": 791, "column": 13, - "stop_line": 773, + "stop_line": 791, "stop_column": 34, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5905,9 +5593,9 @@ "severity": "error" }, { - "line": 783, + "line": 801, "column": 13, - "stop_line": 783, + "stop_line": 801, "stop_column": 34, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5917,9 +5605,9 @@ "severity": "error" }, { - "line": 835, + "line": 853, "column": 13, - "stop_line": 835, + "stop_line": 853, "stop_column": 34, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5929,9 +5617,9 @@ "severity": "error" }, { - "line": 845, + "line": 863, "column": 13, - "stop_line": 845, + "stop_line": 863, "stop_column": 34, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5941,9 +5629,9 @@ "severity": "error" }, { - "line": 888, + "line": 906, "column": 17, - "stop_line": 888, + "stop_line": 906, "stop_column": 38, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5953,9 +5641,9 @@ "severity": "error" }, { - "line": 898, + "line": 916, "column": 17, - "stop_line": 898, + "stop_line": 916, "stop_column": 38, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -5965,93 +5653,9 @@ "severity": "error" }, { - "line": 944, + "line": 1088, "column": 26, - "stop_line": 944, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 945, - "column": 26, - "stop_line": 945, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 946, - "column": 27, - "stop_line": 946, - "stop_column": 40, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 947, - "column": 30, - "stop_line": 947, - "stop_column": 43, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 990, - "column": 9, - "stop_line": 990, - "stop_column": 24, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `delete`", - "concise_description": "Object of class `NoneType` has no attribute `delete`", - "severity": "error" - }, - { - "line": 997, - "column": 37, - "stop_line": 997, - "stop_column": 51, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 997, - "column": 56, - "stop_line": 997, - "stop_column": 67, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `pk`", - "concise_description": "Object of class `NoneType` has no attribute `pk`", - "severity": "error" - }, - { - "line": 1066, - "column": 26, - "stop_line": 1066, + "stop_line": 1088, "stop_column": 39, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6061,9 +5665,9 @@ "severity": "error" }, { - "line": 1067, + "line": 1089, "column": 26, - "stop_line": 1067, + "stop_line": 1089, "stop_column": 47, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6073,9 +5677,9 @@ "severity": "error" }, { - "line": 1069, + "line": 1091, "column": 26, - "stop_line": 1069, + "stop_line": 1091, "stop_column": 39, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6085,9 +5689,9 @@ "severity": "error" }, { - "line": 1070, + "line": 1092, "column": 26, - "stop_line": 1070, + "stop_line": 1092, "stop_column": 47, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6097,9 +5701,9 @@ "severity": "error" }, { - "line": 1072, + "line": 1094, "column": 26, - "stop_line": 1072, + "stop_line": 1094, "stop_column": 39, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6109,9 +5713,9 @@ "severity": "error" }, { - "line": 1073, + "line": 1095, "column": 26, - "stop_line": 1073, + "stop_line": 1095, "stop_column": 47, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6121,9 +5725,9 @@ "severity": "error" }, { - "line": 1169, + "line": 1191, "column": 15, - "stop_line": 1169, + "stop_line": 1191, "stop_column": 36, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6133,21 +5737,9 @@ "severity": "error" }, { - "line": 1178, - "column": 13, - "stop_line": 1178, - "stop_column": 29, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `created`", - "concise_description": "Object of class `NoneType` has no attribute `created`", - "severity": "error" - }, - { - "line": 1199, + "line": 1222, "column": 15, - "stop_line": 1199, + "stop_line": 1222, "stop_column": 36, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6157,21 +5749,9 @@ "severity": "error" }, { - "line": 1208, - "column": 13, - "stop_line": 1208, - "stop_column": 29, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `created`", - "concise_description": "Object of class `NoneType` has no attribute `created`", - "severity": "error" - }, - { - "line": 1229, + "line": 1253, "column": 15, - "stop_line": 1229, + "stop_line": 1253, "stop_column": 36, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6181,21 +5761,9 @@ "severity": "error" }, { - "line": 1238, - "column": 13, - "stop_line": 1238, - "stop_column": 29, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `created`", - "concise_description": "Object of class `NoneType` has no attribute `created`", - "severity": "error" - }, - { - "line": 1261, + "line": 1286, "column": 15, - "stop_line": 1261, + "stop_line": 1286, "stop_column": 36, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6205,21 +5773,9 @@ "severity": "error" }, { - "line": 1270, - "column": 13, - "stop_line": 1270, - "stop_column": 29, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `created`", - "concise_description": "Object of class `NoneType` has no attribute `created`", - "severity": "error" - }, - { - "line": 1285, + "line": 1311, "column": 26, - "stop_line": 1285, + "stop_line": 1311, "stop_column": 47, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6229,9 +5785,9 @@ "severity": "error" }, { - "line": 1410, + "line": 1436, "column": 26, - "stop_line": 1410, + "stop_line": 1436, "stop_column": 47, "path": "src/documents/tests/test_consumer.py", "code": -2, @@ -6288,30 +5844,6 @@ "concise_description": "Class `dirs` has no class attribute `double_sided_dir`", "severity": "error" }, - { - "line": 63, - "column": 42, - "stop_line": 63, - "stop_column": 69, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `tuple[float | Unknown, ...]` is not assignable to parameter `times` with type `tuple[float, float] | tuple[int, int] | None` in function `os.utime`", - "concise_description": "Argument `tuple[float | Unknown, ...]` is not assignable to parameter `times` with type `tuple[float, float] | tuple[int, int] | None` in function `os.utime`", - "severity": "error" - }, - { - "line": 86, - "column": 54, - "stop_line": 86, - "stop_column": 57, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "severity": "error" - }, { "line": 106, "column": 18, @@ -6324,30 +5856,6 @@ "concise_description": "Class `dirs` has no class attribute `consumption_dir`", "severity": "error" }, - { - "line": 132, - "column": 54, - "stop_line": 132, - "stop_column": 57, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "severity": "error" - }, - { - "line": 215, - "column": 25, - "stop_line": 215, - "stop_column": 71, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "bad-specialization", - "description": "`str | None` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", - "concise_description": "`str | None` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", - "severity": "error" - }, { "line": 240, "column": 21, @@ -6360,18 +5868,6 @@ "concise_description": "Class `dirs` has no class attribute `consumption_dir`", "severity": "error" }, - { - "line": 255, - "column": 25, - "stop_line": 255, - "stop_column": 71, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "bad-specialization", - "description": "`str | None` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", - "concise_description": "`str | None` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", - "severity": "error" - }, { "line": 232, "column": 38, @@ -6404,8 +5900,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6416,7 +5912,7 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, @@ -6428,8 +5924,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6440,8 +5936,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6452,8 +5948,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", "severity": "error" }, { @@ -6464,8 +5960,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6476,8 +5972,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6488,8 +5984,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6500,8 +5996,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6512,8 +6008,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6524,8 +6020,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6536,8 +6032,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6548,8 +6044,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", "severity": "error" }, { @@ -6560,8 +6056,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6572,8 +6068,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6584,8 +6080,8 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6596,7 +6092,7 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, @@ -6608,7 +6104,7 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, @@ -6620,7 +6116,7 @@ "path": "src/documents/tests/test_file_handling.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, @@ -6668,8 +6164,8 @@ "path": "src/documents/tests/test_management.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -6704,7 +6200,7 @@ "path": "src/documents/tests/test_management.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, @@ -6716,8 +6212,8 @@ "path": "src/documents/tests/test_management.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", "severity": "error" }, { @@ -6728,8 +6224,8 @@ "path": "src/documents/tests/test_management.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", "severity": "error" }, { @@ -7500,6 +6996,126 @@ "concise_description": "Class `dirs` has no class attribute `scratch_dir`", "severity": "error" }, + { + "line": 58, + "column": 12, + "stop_line": 58, + "stop_column": 25, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `tuple[StoragePathFactory, StoragePathFactory, StoragePathFactory]` is not assignable to declared return type `tuple[StoragePath, StoragePath, StoragePath]`", + "concise_description": "Returned type `tuple[StoragePathFactory, StoragePathFactory, StoragePathFactory]` is not assignable to declared return type `tuple[StoragePath, StoragePath, StoragePath]`", + "severity": "error" + }, + { + "line": 69, + "column": 12, + "stop_line": 69, + "stop_column": 68, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `tuple[TagFactory, TagFactory, TagFactory, TagFactory, TagFactory]` is not assignable to declared return type `tuple[Tag, Tag, Tag, Tag, Tag]`", + "concise_description": "Returned type `tuple[TagFactory, TagFactory, TagFactory, TagFactory, TagFactory]` is not assignable to declared return type `tuple[Tag, Tag, Tag, Tag, Tag]`", + "severity": "error" + }, + { + "line": 83, + "column": 12, + "stop_line": 83, + "stop_column": 29, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `tuple[CorrespondentFactory, CorrespondentFactory]` is not assignable to declared return type `tuple[Correspondent, Correspondent]`", + "concise_description": "Returned type `tuple[CorrespondentFactory, CorrespondentFactory]` is not assignable to declared return type `tuple[Correspondent, Correspondent]`", + "severity": "error" + }, + { + "line": 97, + "column": 12, + "stop_line": 97, + "stop_column": 31, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `tuple[DocumentTypeFactory, DocumentTypeFactory]` is not assignable to declared return type `tuple[DocumentType, DocumentType]`", + "concise_description": "Returned type `tuple[DocumentTypeFactory, DocumentTypeFactory]` is not assignable to declared return type `tuple[DocumentType, DocumentType]`", + "severity": "error" + }, + { + "line": 116, + "column": 5, + "stop_line": 116, + "stop_column": 12, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `tags`", + "concise_description": "Object of class `DocumentFactory` has no attribute `tags`", + "severity": "error" + }, + { + "line": 117, + "column": 5, + "stop_line": 117, + "stop_column": 12, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `tags`", + "concise_description": "Object of class `DocumentFactory` has no attribute `tags`", + "severity": "error" + }, + { + "line": 119, + "column": 12, + "stop_line": 119, + "stop_column": 26, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `tuple[DocumentFactory, DocumentFactory, DocumentFactory, DocumentFactory]` is not assignable to declared return type `tuple[Document, Document, Document, Document]`", + "concise_description": "Returned type `tuple[DocumentFactory, DocumentFactory, DocumentFactory, DocumentFactory]` is not assignable to declared return type `tuple[Document, Document, Document, Document]`", + "severity": "error" + }, + { + "line": 265, + "column": 9, + "stop_line": 265, + "stop_column": 28, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", + "severity": "error" + }, + { + "line": 337, + "column": 9, + "stop_line": 337, + "stop_column": 28, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", + "severity": "error" + }, + { + "line": 416, + "column": 9, + "stop_line": 416, + "stop_column": 28, + "path": "src/documents/tests/test_management_retagger.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", + "severity": "error" + }, { "line": 89, "column": 9, @@ -7573,57 +7189,45 @@ "severity": "error" }, { - "line": 133, + "line": 132, "column": 14, - "stop_line": 133, + "stop_line": 132, "stop_column": 37, "path": "src/documents/tests/test_sanity_check.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 152, + "line": 151, "column": 24, - "stop_line": 152, + "stop_line": 151, "stop_column": 47, "path": "src/documents/tests/test_sanity_check.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 165, + "line": 164, "column": 14, - "stop_line": 165, + "stop_line": 164, "stop_column": 37, "path": "src/documents/tests/test_sanity_check.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 258, - "column": 16, - "stop_line": 258, - "stop_column": 55, - "path": "src/documents/tests/test_sanity_check.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `Literal['Check logs for details']` and `None`", - "concise_description": "`in` is not supported between `Literal['Check logs for details']` and `None`", - "severity": "error" - }, - { - "line": 125, + "line": 127, "column": 28, - "stop_line": 125, + "stop_line": 127, "stop_column": 47, "path": "src/documents/tests/test_share_link_bundles.py", "code": -2, @@ -7633,9 +7237,9 @@ "severity": "error" }, { - "line": 139, + "line": 141, "column": 28, - "stop_line": 139, + "stop_line": 141, "stop_column": 54, "path": "src/documents/tests/test_share_link_bundles.py", "code": -2, @@ -7645,9 +7249,9 @@ "severity": "error" }, { - "line": 200, + "line": 202, "column": 29, - "stop_line": 200, + "stop_line": 202, "stop_column": 48, "path": "src/documents/tests/test_share_link_bundles.py", "code": -2, @@ -7657,9 +7261,9 @@ "severity": "error" }, { - "line": 204, + "line": 206, "column": 28, - "stop_line": 204, + "stop_line": 206, "stop_column": 47, "path": "src/documents/tests/test_share_link_bundles.py", "code": -2, @@ -7669,9 +7273,9 @@ "severity": "error" }, { - "line": 434, + "line": 440, "column": 30, - "stop_line": 434, + "stop_line": 440, "stop_column": 49, "path": "src/documents/tests/test_share_link_bundles.py", "code": -2, @@ -7681,9 +7285,9 @@ "severity": "error" }, { - "line": 437, + "line": 443, "column": 26, - "stop_line": 437, + "stop_line": 443, "stop_column": 59, "path": "src/documents/tests/test_share_link_bundles.py", "code": -2, @@ -7717,69 +7321,189 @@ "severity": "error" }, { - "line": 27, - "column": 20, - "stop_line": 27, - "stop_column": 56, + "line": 196, + "column": 9, + "stop_line": 196, + "stop_column": 29, "path": "src/documents/tests/test_task_signals.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `create_user`", - "concise_description": "Object of class `Manager` has no attribute `create_user`", + "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", "severity": "error" }, { - "line": 62, - "column": 35, - "stop_line": 62, - "stop_column": 59, + "line": 198, + "column": 16, + "stop_line": 198, + "stop_column": 33, "path": "src/documents/tests/test_task_signals.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['/consume/hello-999.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", - "concise_description": "Argument `Literal['/consume/hello-999.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `date_started`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `date_started`", "severity": "error" }, { - "line": 106, - "column": 35, - "stop_line": 106, - "stop_column": 58, + "line": 216, + "column": 16, + "stop_line": 220, + "stop_column": 10, "path": "src/documents/tests/test_task_signals.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['/consume/hello-99.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", - "concise_description": "Argument `Literal['/consume/hello-99.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "name": "bad-return", + "description": "Returned type `PaperlessTaskFactory` is not assignable to declared return type `PaperlessTask`", + "concise_description": "Returned type `PaperlessTaskFactory` is not assignable to declared return type `PaperlessTask`", "severity": "error" }, { - "line": 145, - "column": 35, - "stop_line": 145, - "stop_column": 57, + "line": 309, + "column": 9, + "stop_line": 309, + "stop_column": 29, "path": "src/documents/tests/test_task_signals.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['/consume/hello-9.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", - "concise_description": "Argument `Literal['/consume/hello-9.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", "severity": "error" }, { - "line": 187, - "column": 35, - "stop_line": 187, - "stop_column": 57, + "line": 311, + "column": 16, + "stop_line": 311, + "stop_column": 46, "path": "src/documents/tests/test_task_signals.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['/consume/hello-9.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", - "concise_description": "Argument `Literal['/consume/hello-9.pdf']` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", "severity": "error" }, { - "line": 227, + "line": 312, + "column": 16, + "stop_line": 312, + "stop_column": 49, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 313, + "column": 16, + "stop_line": 313, + "stop_column": 30, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", + "severity": "error" + }, + { + "line": 334, + "column": 9, + "stop_line": 334, + "stop_column": 29, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "severity": "error" + }, + { + "line": 335, + "column": 16, + "stop_line": 335, + "stop_column": 47, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "not-iterable", + "description": "`in` is not supported between `Literal['traceback']` and `None`", + "concise_description": "`in` is not supported between `Literal['traceback']` and `None`", + "severity": "error" + }, + { + "line": 336, + "column": 20, + "stop_line": 336, + "stop_column": 49, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 353, + "column": 9, + "stop_line": 353, + "stop_column": 29, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "severity": "error" + }, + { + "line": 354, + "column": 16, + "stop_line": 354, + "stop_column": 37, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `duration_seconds`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `duration_seconds`", + "severity": "error" + }, + { + "line": 355, + "column": 16, + "stop_line": 355, + "stop_column": 38, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `wait_time_seconds`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `wait_time_seconds`", + "severity": "error" + }, + { + "line": 371, + "column": 9, + "stop_line": 371, + "stop_column": 29, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", + "severity": "error" + }, + { + "line": 373, + "column": 16, + "stop_line": 373, + "stop_column": 30, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", + "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", + "severity": "error" + }, + { + "line": 228, "column": 19, - "stop_line": 227, + "stop_line": 228, "stop_column": 40, "path": "src/documents/tests/test_tasks.py", "code": -2, @@ -7789,9 +7513,9 @@ "severity": "error" }, { - "line": 236, + "line": 237, "column": 27, - "stop_line": 236, + "stop_line": 237, "stop_column": 48, "path": "src/documents/tests/test_tasks.py", "code": -2, @@ -7801,9 +7525,9 @@ "severity": "error" }, { - "line": 268, + "line": 269, "column": 19, - "stop_line": 268, + "stop_line": 269, "stop_column": 40, "path": "src/documents/tests/test_tasks.py", "code": -2, @@ -7812,18 +7536,6 @@ "concise_description": "Class `dirs` has no class attribute `scratch_dir`", "severity": "error" }, - { - "line": 346, - "column": 55, - "stop_line": 346, - "stop_column": 66, - "path": "src/documents/tests/test_tasks.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "severity": "error" - }, { "line": 46, "column": 26, @@ -8004,118 +7716,10 @@ "concise_description": "Class `dirs` has no class attribute `scratch_dir`", "severity": "error" }, - { - "line": 190, - "column": 34, - "stop_line": 190, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 191, - "column": 34, - "stop_line": 191, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 192, - "column": 39, - "stop_line": 192, - "stop_column": 52, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 193, - "column": 34, - "stop_line": 193, - "stop_column": 55, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 194, - "column": 34, - "stop_line": 194, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 198, - "column": 29, - "stop_line": 198, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 206, - "column": 25, - "stop_line": 208, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, { "line": 207, - "column": 29, - "stop_line": 207, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 215, - "column": 29, - "stop_line": 215, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 223, "column": 25, - "stop_line": 225, + "stop_line": 209, "stop_column": 26, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8126,56 +7730,44 @@ }, { "line": 224, - "column": 29, - "stop_line": 224, - "stop_column": 37, + "column": 25, + "stop_line": 226, + "stop_column": 26, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", + "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", "severity": "error" }, { - "line": 230, - "column": 21, - "stop_line": 230, - "stop_column": 35, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 234, + "line": 235, "column": 26, - "stop_line": 234, + "stop_line": 235, "stop_column": 48, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", "severity": "error" }, { - "line": 238, + "line": 239, "column": 21, - "stop_line": 238, + "stop_line": 239, "stop_column": 43, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", "severity": "error" }, { - "line": 287, + "line": 288, "column": 13, - "stop_line": 287, + "stop_line": 288, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8185,81 +7777,9 @@ "severity": "error" }, { - "line": 301, - "column": 34, - "stop_line": 301, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 302, - "column": 34, - "stop_line": 302, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 303, - "column": 39, - "stop_line": 303, - "stop_column": 52, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 304, - "column": 34, - "stop_line": 304, - "stop_column": 55, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 305, - "column": 34, - "stop_line": 305, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 309, - "column": 29, - "stop_line": 309, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 317, + "line": 319, "column": 25, - "stop_line": 319, + "stop_line": 321, "stop_column": 26, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8269,33 +7789,9 @@ "severity": "error" }, { - "line": 318, - "column": 29, - "stop_line": 318, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 326, - "column": 29, - "stop_line": 326, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 334, + "line": 336, "column": 25, - "stop_line": 336, + "stop_line": 338, "stop_column": 26, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8305,33 +7801,9 @@ "severity": "error" }, { - "line": 335, - "column": 29, - "stop_line": 335, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 341, - "column": 21, - "stop_line": 341, - "stop_column": 35, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 361, + "line": 363, "column": 30, - "stop_line": 361, + "stop_line": 363, "stop_column": 51, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8341,9 +7813,9 @@ "severity": "error" }, { - "line": 405, + "line": 407, "column": 13, - "stop_line": 405, + "stop_line": 407, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8353,69 +7825,9 @@ "severity": "error" }, { - "line": 419, - "column": 34, - "stop_line": 419, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 421, - "column": 34, - "stop_line": 421, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 422, - "column": 34, - "stop_line": 422, - "stop_column": 55, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 425, - "column": 26, - "stop_line": 425, - "stop_column": 39, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 431, + "line": 459, "column": 29, - "stop_line": 431, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 456, - "column": 29, - "stop_line": 456, + "stop_line": 459, "stop_column": 50, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8425,9 +7837,9 @@ "severity": "error" }, { - "line": 473, + "line": 476, "column": 13, - "stop_line": 473, + "stop_line": 476, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8437,21 +7849,9 @@ "severity": "error" }, { - "line": 486, - "column": 34, - "stop_line": 486, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 525, + "line": 529, "column": 13, - "stop_line": 525, + "stop_line": 529, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8461,81 +7861,9 @@ "severity": "error" }, { - "line": 538, - "column": 35, - "stop_line": 538, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 539, - "column": 35, - "stop_line": 539, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 540, - "column": 34, - "stop_line": 540, - "stop_column": 47, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 541, - "column": 35, - "stop_line": 541, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 542, - "column": 35, - "stop_line": 542, - "stop_column": 49, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 545, - "column": 25, - "stop_line": 545, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 547, + "line": 552, "column": 28, - "stop_line": 547, + "stop_line": 552, "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8544,46 +7872,22 @@ "concise_description": "Missing positional argument `value` in function `list.count`", "severity": "error" }, - { - "line": 550, - "column": 34, - "stop_line": 550, - "stop_column": 71, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 550, - "column": 56, - "stop_line": 550, - "stop_column": 64, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 553, - "column": 25, - "stop_line": 553, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, { "line": 555, - "column": 28, + "column": 46, "stop_line": 555, + "stop_column": 77, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "line": 561, + "column": 28, + "stop_line": 561, "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8593,45 +7897,21 @@ "severity": "error" }, { - "line": 558, - "column": 34, - "stop_line": 558, - "stop_column": 71, + "line": 564, + "column": 46, + "stop_line": 564, + "stop_column": 77, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 558, - "column": 56, - "stop_line": 558, - "stop_column": 64, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 559, - "column": 34, - "stop_line": 559, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 563, + "line": 570, "column": 45, - "stop_line": 563, + "stop_line": 570, "stop_column": 59, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8641,9 +7921,9 @@ "severity": "error" }, { - "line": 599, + "line": 606, "column": 13, - "stop_line": 599, + "stop_line": 606, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8653,81 +7933,9 @@ "severity": "error" }, { - "line": 612, - "column": 35, - "stop_line": 612, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 613, - "column": 35, - "stop_line": 613, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 614, - "column": 34, - "stop_line": 614, - "stop_column": 47, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 615, - "column": 35, - "stop_line": 615, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 616, - "column": 35, - "stop_line": 616, - "stop_column": 49, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 619, - "column": 25, - "stop_line": 619, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 621, + "line": 629, "column": 28, - "stop_line": 621, + "stop_line": 629, "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8736,46 +7944,22 @@ "concise_description": "Missing positional argument `value` in function `list.count`", "severity": "error" }, - { - "line": 625, - "column": 21, - "stop_line": 627, - "stop_column": 28, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 626, - "column": 25, - "stop_line": 626, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, { "line": 632, - "column": 25, + "column": 46, "stop_line": 632, - "stop_column": 33, + "stop_column": 77, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 634, + "line": 638, "column": 28, - "stop_line": 634, + "stop_line": 638, "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8785,39 +7969,15 @@ "severity": "error" }, { - "line": 638, - "column": 21, - "stop_line": 640, - "stop_column": 28, + "line": 641, + "column": 46, + "stop_line": 641, + "stop_column": 77, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 639, - "column": 25, - "stop_line": 639, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 643, - "column": 34, - "stop_line": 643, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { @@ -8833,81 +7993,9 @@ "severity": "error" }, { - "line": 699, - "column": 35, - "stop_line": 699, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 700, - "column": 35, - "stop_line": 700, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 701, - "column": 34, - "stop_line": 701, - "stop_column": 47, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 702, - "column": 35, - "stop_line": 702, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 703, - "column": 35, - "stop_line": 703, - "stop_column": 49, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 706, - "column": 25, - "stop_line": 706, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 708, + "line": 709, "column": 28, - "stop_line": 708, + "stop_line": 709, "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -8918,92 +8006,44 @@ }, { "line": 712, - "column": 21, - "stop_line": 714, - "stop_column": 28, + "column": 46, + "stop_line": 712, + "stop_column": 77, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 713, - "column": 25, - "stop_line": 713, - "stop_column": 33, + "line": 718, + "column": 28, + "stop_line": 718, + "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 719, - "column": 25, - "stop_line": 719, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", + "name": "bad-argument-count", + "description": "Missing positional argument `value` in function `list.count`", + "concise_description": "Missing positional argument `value` in function `list.count`", "severity": "error" }, { "line": 721, - "column": 28, + "column": 46, "stop_line": 721, - "stop_column": 30, + "stop_column": 77, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 725, - "column": 21, - "stop_line": 727, - "stop_column": 28, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 726, - "column": 25, - "stop_line": 726, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 730, - "column": 34, - "stop_line": 730, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 770, + "line": 763, "column": 13, - "stop_line": 770, + "stop_line": 763, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9012,82 +8052,10 @@ "concise_description": "Class `dirs` has no class attribute `scratch_dir`", "severity": "error" }, - { - "line": 783, - "column": 35, - "stop_line": 783, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 784, - "column": 35, - "stop_line": 784, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 785, - "column": 34, - "stop_line": 785, - "stop_column": 47, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, { "line": 786, - "column": 35, + "column": 28, "stop_line": 786, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 787, - "column": 35, - "stop_line": 787, - "stop_column": 49, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 790, - "column": 25, - "stop_line": 790, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 792, - "column": 28, - "stop_line": 792, "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9097,93 +8065,45 @@ "severity": "error" }, { - "line": 796, - "column": 21, + "line": 789, + "column": 46, + "stop_line": 789, + "stop_column": 77, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "line": 795, + "column": 28, + "stop_line": 795, + "stop_column": 30, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-count", + "description": "Missing positional argument `value` in function `list.count`", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "line": 798, + "column": 46, "stop_line": 798, - "stop_column": 28, + "stop_column": 77, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 797, - "column": 25, - "stop_line": 797, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 803, - "column": 25, - "stop_line": 803, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 805, - "column": 28, - "stop_line": 805, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 809, - "column": 21, - "stop_line": 811, - "stop_column": 28, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 810, - "column": 25, - "stop_line": 810, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 814, - "column": 34, - "stop_line": 814, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 888, + "line": 874, "column": 13, - "stop_line": 888, + "stop_line": 874, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9193,69 +8113,69 @@ "severity": "error" }, { - "line": 902, + "line": 889, "column": 26, - "stop_line": 902, + "stop_line": 889, "stop_column": 48, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", "severity": "error" }, { - "line": 963, + "line": 950, "column": 31, - "stop_line": 963, + "stop_line": 950, "stop_column": 43, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 1435, + "line": 1422, "column": 40, - "stop_line": 1435, + "stop_line": 1422, "stop_column": 46, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", "severity": "error" }, { - "line": 1451, + "line": 1438, "column": 35, - "stop_line": 1451, + "stop_line": 1438, "stop_column": 41, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", "severity": "error" }, { - "line": 1470, + "line": 1457, "column": 39, - "stop_line": 1470, + "stop_line": 1457, "stop_column": 45, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", "severity": "error" }, { - "line": 1935, + "line": 1922, "column": 26, - "stop_line": 1935, + "stop_line": 1922, "stop_column": 43, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9265,9 +8185,9 @@ "severity": "error" }, { - "line": 1960, + "line": 1947, "column": 13, - "stop_line": 1960, + "stop_line": 1947, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9277,21 +8197,9 @@ "severity": "error" }, { - "line": 1972, - "column": 17, - "stop_line": 1972, - "stop_column": 31, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 2018, + "line": 2006, "column": 26, - "stop_line": 2018, + "stop_line": 2006, "stop_column": 43, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9301,45 +8209,45 @@ "severity": "error" }, { - "line": 2067, + "line": 2055, + "column": 43, + "stop_line": 2058, + "stop_column": 10, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-assignment", + "description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "line": 2059, + "column": 45, + "stop_line": 2062, + "stop_column": 10, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-assignment", + "description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "line": 2070, "column": 38, "stop_line": 2070, - "stop_column": 10, + "stop_column": 64, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-assignment", - "description": "`list[str] | Any` is not assignable to `QuerySet[Unknown]`", - "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Unknown]`", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 2071, - "column": 40, - "stop_line": 2074, - "stop_column": 10, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`list[str] | Any` is not assignable to `QuerySet[Unknown]`", - "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Unknown]`", - "severity": "error" - }, - { - "line": 2082, - "column": 33, - "stop_line": 2082, - "stop_column": 59, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown]`", - "severity": "error" - }, - { - "line": 2845, + "line": 2833, "column": 26, - "stop_line": 2845, + "stop_line": 2833, "stop_column": 43, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9349,21 +8257,21 @@ "severity": "error" }, { - "line": 2848, - "column": 33, - "stop_line": 2848, - "stop_column": 59, + "line": 2836, + "column": 38, + "stop_line": 2836, + "stop_column": 64, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown]`", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 2916, + "line": 2904, "column": 26, - "stop_line": 2916, + "stop_line": 2904, "stop_column": 43, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9373,21 +8281,21 @@ "severity": "error" }, { - "line": 2919, - "column": 33, - "stop_line": 2919, - "stop_column": 59, + "line": 2907, + "column": 38, + "stop_line": 2907, + "stop_column": 64, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown]`", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 2983, + "line": 2971, "column": 13, - "stop_line": 2983, + "stop_line": 2971, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9397,81 +8305,9 @@ "severity": "error" }, { - "line": 2998, - "column": 35, - "stop_line": 2998, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 2999, - "column": 35, - "stop_line": 2999, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 3001, - "column": 26, - "stop_line": 3001, - "stop_column": 39, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 3004, - "column": 35, - "stop_line": 3004, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 3005, - "column": 35, - "stop_line": 3005, - "stop_column": 49, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 3009, - "column": 29, - "stop_line": 3009, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 3017, + "line": 3006, "column": 25, - "stop_line": 3019, + "stop_line": 3008, "stop_column": 26, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9481,81 +8317,33 @@ "severity": "error" }, { - "line": 3018, - "column": 29, - "stop_line": 3018, - "stop_column": 37, + "line": 3023, + "column": 25, + "stop_line": 3025, + "stop_column": 26, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 3026, - "column": 29, - "stop_line": 3026, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", + "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", "severity": "error" }, { "line": 3034, - "column": 25, - "stop_line": 3036, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, - { - "line": 3035, - "column": 29, - "stop_line": 3035, - "stop_column": 37, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 3041, - "column": 21, - "stop_line": 3041, - "stop_column": 35, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 3045, "column": 26, - "stop_line": 3045, + "stop_line": 3034, "stop_column": 48, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", "severity": "error" }, { - "line": 3106, + "line": 3095, "column": 13, - "stop_line": 3106, + "stop_line": 3095, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9566,80 +8354,8 @@ }, { "line": 3119, - "column": 35, - "stop_line": 3119, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 3120, - "column": 35, - "stop_line": 3120, - "stop_column": 57, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `document_type`", - "concise_description": "Object of class `NoneType` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 3121, - "column": 34, - "stop_line": 3121, - "stop_column": 47, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `tags`", - "concise_description": "Object of class `NoneType` has no attribute `tags`", - "severity": "error" - }, - { - "line": 3123, - "column": 35, - "stop_line": 3123, - "stop_column": 56, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", - "concise_description": "Object of class `NoneType` has no attribute `storage_path`", - "severity": "error" - }, - { - "line": 3124, - "column": 35, - "stop_line": 3124, - "stop_column": 49, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 3127, - "column": 25, - "stop_line": 3127, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 3129, "column": 28, - "stop_line": 3129, + "stop_line": 3119, "stop_column": 30, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9649,93 +8365,57 @@ "severity": "error" }, { - "line": 3133, - "column": 21, - "stop_line": 3135, - "stop_column": 28, + "line": 3122, + "column": 46, + "stop_line": 3122, + "stop_column": 77, "path": "src/documents/tests/test_workflows.py", "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "line": 3128, + "column": 28, + "stop_line": 3128, + "stop_column": 30, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-count", + "description": "Missing positional argument `value` in function `list.count`", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "line": 3131, + "column": 46, + "stop_line": 3131, + "stop_column": 77, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-assignment", + "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { "line": 3134, - "column": 25, + "column": 21, "stop_line": 3134, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 3140, - "column": 25, - "stop_line": 3140, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_users_with_perms`", - "severity": "error" - }, - { - "line": 3142, - "column": 28, - "stop_line": 3142, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 3146, - "column": 21, - "stop_line": 3148, - "stop_column": 28, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 3147, - "column": 25, - "stop_line": 3147, - "stop_column": 33, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "concise_description": "Argument `Document | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_groups_with_perms`", - "severity": "error" - }, - { - "line": 3152, - "column": 21, - "stop_line": 3152, "stop_column": 43, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`\nObject of class `NoneType` has no attribute `custom_fields`", + "description": "Object of class `Document` has no attribute `custom_fields`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", "severity": "error" }, { - "line": 3261, + "line": 3246, "column": 13, - "stop_line": 3261, + "stop_line": 3246, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9745,9 +8425,9 @@ "severity": "error" }, { - "line": 3273, + "line": 3258, "column": 27, - "stop_line": 3273, + "stop_line": 3258, "stop_column": 44, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9757,9 +8437,9 @@ "severity": "error" }, { - "line": 3361, + "line": 3346, "column": 13, - "stop_line": 3361, + "stop_line": 3346, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9769,9 +8449,9 @@ "severity": "error" }, { - "line": 3399, + "line": 3384, "column": 13, - "stop_line": 3399, + "stop_line": 3384, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9781,9 +8461,9 @@ "severity": "error" }, { - "line": 3619, + "line": 3604, "column": 13, - "stop_line": 3619, + "stop_line": 3604, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9793,9 +8473,9 @@ "severity": "error" }, { - "line": 3739, + "line": 3726, "column": 13, - "stop_line": 3739, + "stop_line": 3726, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9805,9 +8485,9 @@ "severity": "error" }, { - "line": 3868, + "line": 3975, "column": 23, - "stop_line": 3868, + "stop_line": 3975, "stop_column": 27, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9817,9 +8497,9 @@ "severity": "error" }, { - "line": 3886, + "line": 3993, "column": 23, - "stop_line": 3886, + "stop_line": 3993, "stop_column": 27, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9829,9 +8509,9 @@ "severity": "error" }, { - "line": 3911, + "line": 4018, "column": 27, - "stop_line": 3911, + "stop_line": 4018, "stop_column": 31, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9841,9 +8521,9 @@ "severity": "error" }, { - "line": 3959, + "line": 4066, "column": 13, - "stop_line": 3959, + "stop_line": 4066, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9853,9 +8533,9 @@ "severity": "error" }, { - "line": 4008, + "line": 4115, "column": 23, - "stop_line": 4008, + "stop_line": 4115, "stop_column": 35, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9865,9 +8545,9 @@ "severity": "error" }, { - "line": 4057, + "line": 4164, "column": 23, - "stop_line": 4057, + "stop_line": 4164, "stop_column": 35, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9877,9 +8557,9 @@ "severity": "error" }, { - "line": 4089, + "line": 4196, "column": 23, - "stop_line": 4089, + "stop_line": 4196, "stop_column": 35, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9889,9 +8569,9 @@ "severity": "error" }, { - "line": 4302, + "line": 4409, "column": 13, - "stop_line": 4302, + "stop_line": 4409, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9901,9 +8581,9 @@ "severity": "error" }, { - "line": 4494, + "line": 4601, "column": 13, - "stop_line": 4494, + "stop_line": 4601, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9913,9 +8593,9 @@ "severity": "error" }, { - "line": 4558, + "line": 4665, "column": 13, - "stop_line": 4558, + "stop_line": 4665, "stop_column": 34, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9925,9 +8605,9 @@ "severity": "error" }, { - "line": 4607, + "line": 4714, "column": 19, - "stop_line": 4607, + "stop_line": 4714, "stop_column": 23, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9937,9 +8617,9 @@ "severity": "error" }, { - "line": 4610, + "line": 4717, "column": 16, - "stop_line": 4610, + "stop_line": 4717, "stop_column": 48, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9949,9 +8629,9 @@ "severity": "error" }, { - "line": 4620, + "line": 4727, "column": 19, - "stop_line": 4620, + "stop_line": 4727, "stop_column": 23, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9961,9 +8641,9 @@ "severity": "error" }, { - "line": 4623, + "line": 4730, "column": 16, - "stop_line": 4623, + "stop_line": 4730, "stop_column": 48, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9973,9 +8653,9 @@ "severity": "error" }, { - "line": 4660, + "line": 4767, "column": 23, - "stop_line": 4660, + "stop_line": 4767, "stop_column": 27, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -9985,81 +8665,9 @@ "severity": "error" }, { - "line": 4669, + "line": 4776, "column": 23, - "stop_line": 4669, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4688, - "column": 23, - "stop_line": 4688, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4715, - "column": 23, - "stop_line": 4715, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4739, - "column": 19, - "stop_line": 4739, - "stop_column": 23, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4744, - "column": 16, - "stop_line": 4744, - "stop_column": 23, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `url`", - "concise_description": "Object of class `NoneType` has no attribute `url`", - "severity": "error" - }, - { - "line": 4745, - "column": 16, - "stop_line": 4745, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `headers`", - "concise_description": "Object of class `NoneType` has no attribute `headers`", - "severity": "error" - }, - { - "line": 4769, - "column": 23, - "stop_line": 4769, + "stop_line": 4776, "stop_column": 27, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -10070,8 +8678,32 @@ }, { "line": 4795, - "column": 19, + "column": 23, "stop_line": 4795, + "stop_column": 27, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "line": 4822, + "column": 23, + "stop_line": 4822, + "stop_column": 27, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "line": 4846, + "column": 19, + "stop_line": 4846, "stop_column": 23, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -10081,9 +8713,21 @@ "severity": "error" }, { - "line": 4800, + "line": 4851, "column": 16, - "stop_line": 4800, + "stop_line": 4851, + "stop_column": 23, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `url`", + "concise_description": "Object of class `NoneType` has no attribute `url`", + "severity": "error" + }, + { + "line": 4852, + "column": 16, + "stop_line": 4852, "stop_column": 27, "path": "src/documents/tests/test_workflows.py", "code": -2, @@ -10093,10 +8737,34 @@ "severity": "error" }, { - "line": 4801, - "column": 35, - "stop_line": 4801, - "stop_column": 46, + "line": 4876, + "column": 23, + "stop_line": 4876, + "stop_column": 27, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "line": 4902, + "column": 19, + "stop_line": 4902, + "stop_column": 23, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "line": 4907, + "column": 16, + "stop_line": 4907, + "stop_column": 27, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "missing-attribute", @@ -10105,27 +8773,15 @@ "severity": "error" }, { - "line": 5037, - "column": 20, - "stop_line": 5037, - "stop_column": 34, + "line": 4908, + "column": 35, + "stop_line": 4908, + "stop_column": 46, "path": "src/documents/tests/test_workflows.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", - "concise_description": "Object of class `NoneType` has no attribute `title`", - "severity": "error" - }, - { - "line": 34, - "column": 23, - "stop_line": 34, - "stop_column": 29, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "invalid-argument", - "description": "Expected string literal \"dirs\"", - "concise_description": "Expected string literal \"dirs\"", + "description": "Object of class `NoneType` has no attribute `headers`", + "concise_description": "Object of class `NoneType` has no attribute `headers`", "severity": "error" }, { @@ -10537,9 +9193,9 @@ "severity": "error" }, { - "line": 243, + "line": 245, "column": 9, - "stop_line": 243, + "stop_line": 245, "stop_column": 22, "path": "src/documents/tests/utils.py", "code": -2, @@ -10549,9 +9205,9 @@ "severity": "error" }, { - "line": 246, + "line": 248, "column": 9, - "stop_line": 246, + "stop_line": 248, "stop_column": 25, "path": "src/documents/tests/utils.py", "code": -2, @@ -10561,9 +9217,9 @@ "severity": "error" }, { - "line": 296, + "line": 272, "column": 16, - "stop_line": 296, + "stop_line": 272, "stop_column": 74, "path": "src/documents/tests/utils.py", "code": -2, @@ -10573,9 +9229,9 @@ "severity": "error" }, { - "line": 377, + "line": 353, "column": 13, - "stop_line": 377, + "stop_line": 353, "stop_column": 22, "path": "src/documents/tests/utils.py", "code": -2, @@ -10585,9 +9241,9 @@ "severity": "error" }, { - "line": 385, + "line": 361, "column": 13, - "stop_line": 385, + "stop_line": 361, "stop_column": 22, "path": "src/documents/tests/utils.py", "code": -2, @@ -10597,9 +9253,9 @@ "severity": "error" }, { - "line": 393, + "line": 369, "column": 13, - "stop_line": 393, + "stop_line": 369, "stop_column": 22, "path": "src/documents/tests/utils.py", "code": -2, @@ -10621,9 +9277,9 @@ "severity": "error" }, { - "line": 277, + "line": 289, "column": 31, - "stop_line": 277, + "stop_line": 289, "stop_column": 57, "path": "src/documents/views.py", "code": -2, @@ -10633,9 +9289,9 @@ "severity": "error" }, { - "line": 278, + "line": 290, "column": 32, - "stop_line": 278, + "stop_line": 290, "stop_column": 63, "path": "src/documents/views.py", "code": -2, @@ -10645,9 +9301,9 @@ "severity": "error" }, { - "line": 333, + "line": 345, "column": 17, - "stop_line": 333, + "stop_line": 345, "stop_column": 30, "path": "src/documents/views.py", "code": -2, @@ -10657,9 +9313,9 @@ "severity": "error" }, { - "line": 365, + "line": 377, "column": 19, - "stop_line": 365, + "stop_line": 377, "stop_column": 49, "path": "src/documents/views.py", "code": -2, @@ -10669,9 +9325,9 @@ "severity": "error" }, { - "line": 368, + "line": 380, "column": 21, - "stop_line": 368, + "stop_line": 380, "stop_column": 33, "path": "src/documents/views.py", "code": -2, @@ -10681,9 +9337,9 @@ "severity": "error" }, { - "line": 383, + "line": 395, "column": 24, - "stop_line": 383, + "stop_line": 395, "stop_column": 44, "path": "src/documents/views.py", "code": -2, @@ -10693,9 +9349,9 @@ "severity": "error" }, { - "line": 383, + "line": 395, "column": 45, - "stop_line": 383, + "stop_line": 395, "stop_column": 62, "path": "src/documents/views.py", "code": -2, @@ -10705,9 +9361,9 @@ "severity": "error" }, { - "line": 385, + "line": 397, "column": 22, - "stop_line": 385, + "stop_line": 397, "stop_column": 35, "path": "src/documents/views.py", "code": -2, @@ -10717,9 +9373,9 @@ "severity": "error" }, { - "line": 487, + "line": 499, "column": 29, - "stop_line": 487, + "stop_line": 499, "stop_column": 51, "path": "src/documents/views.py", "code": -2, @@ -10729,9 +9385,9 @@ "severity": "error" }, { - "line": 493, + "line": 505, "column": 25, - "stop_line": 493, + "stop_line": 505, "stop_column": 47, "path": "src/documents/views.py", "code": -2, @@ -10741,21 +9397,9 @@ "severity": "error" }, { - "line": 557, - "column": 13, - "stop_line": 557, - "stop_column": 65, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `append`", - "concise_description": "Object of class `NoneType` has no attribute `append`", - "severity": "error" - }, - { - "line": 887, + "line": 930, "column": 48, - "stop_line": 887, + "stop_line": 930, "stop_column": 64, "path": "src/documents/views.py", "code": -2, @@ -10765,9 +9409,9 @@ "severity": "error" }, { - "line": 890, + "line": 933, "column": 48, - "stop_line": 890, + "stop_line": 933, "stop_column": 64, "path": "src/documents/views.py", "code": -2, @@ -10777,9 +9421,9 @@ "severity": "error" }, { - "line": 893, + "line": 936, "column": 48, - "stop_line": 893, + "stop_line": 936, "stop_column": 64, "path": "src/documents/views.py", "code": -2, @@ -10789,9 +9433,9 @@ "severity": "error" }, { - "line": 896, + "line": 939, "column": 48, - "stop_line": 896, + "stop_line": 939, "stop_column": 64, "path": "src/documents/views.py", "code": -2, @@ -10801,9 +9445,9 @@ "severity": "error" }, { - "line": 899, + "line": 942, "column": 48, - "stop_line": 899, + "stop_line": 942, "stop_column": 64, "path": "src/documents/views.py", "code": -2, @@ -10813,9 +9457,9 @@ "severity": "error" }, { - "line": 1069, + "line": 1115, "column": 9, - "stop_line": 1069, + "stop_line": 1115, "stop_column": 16, "path": "src/documents/views.py", "code": -2, @@ -10825,9 +9469,9 @@ "severity": "error" }, { - "line": 1223, + "line": 1269, "column": 37, - "stop_line": 1223, + "stop_line": 1269, "stop_column": 54, "path": "src/documents/views.py", "code": -2, @@ -10837,9 +9481,9 @@ "severity": "error" }, { - "line": 1334, + "line": 1383, "column": 45, - "stop_line": 1334, + "stop_line": 1383, "stop_column": 57, "path": "src/documents/views.py", "code": -2, @@ -10849,9 +9493,9 @@ "severity": "error" }, { - "line": 1347, + "line": 1396, "column": 61, - "stop_line": 1347, + "stop_line": 1396, "stop_column": 71, "path": "src/documents/views.py", "code": -2, @@ -10861,9 +9505,9 @@ "severity": "error" }, { - "line": 1349, + "line": 1398, "column": 56, - "stop_line": 1349, + "stop_line": 1398, "stop_column": 66, "path": "src/documents/views.py", "code": -2, @@ -10873,9 +9517,9 @@ "severity": "error" }, { - "line": 1351, + "line": 1400, "column": 63, - "stop_line": 1351, + "stop_line": 1400, "stop_column": 73, "path": "src/documents/views.py", "code": -2, @@ -10885,9 +9529,9 @@ "severity": "error" }, { - "line": 1354, + "line": 1403, "column": 62, - "stop_line": 1354, + "stop_line": 1403, "stop_column": 72, "path": "src/documents/views.py", "code": -2, @@ -10897,9 +9541,9 @@ "severity": "error" }, { - "line": 1468, + "line": 1517, "column": 21, - "stop_line": 1468, + "stop_line": 1517, "stop_column": 48, "path": "src/documents/views.py", "code": -2, @@ -10909,9 +9553,9 @@ "severity": "error" }, { - "line": 1503, + "line": 1559, "column": 17, - "stop_line": 1503, + "stop_line": 1559, "stop_column": 44, "path": "src/documents/views.py", "code": -2, @@ -10921,9 +9565,9 @@ "severity": "error" }, { - "line": 1530, + "line": 1586, "column": 5, - "stop_line": 1530, + "stop_line": 1586, "stop_column": 62, "path": "src/documents/views.py", "code": -2, @@ -10933,9 +9577,9 @@ "severity": "error" }, { - "line": 1587, + "line": 1643, "column": 26, - "stop_line": 1587, + "stop_line": 1643, "stop_column": 57, "path": "src/documents/views.py", "code": -2, @@ -10945,9 +9589,9 @@ "severity": "error" }, { - "line": 1593, + "line": 1649, "column": 22, - "stop_line": 1593, + "stop_line": 1649, "stop_column": 54, "path": "src/documents/views.py", "code": -2, @@ -10957,9 +9601,9 @@ "severity": "error" }, { - "line": 1594, + "line": 1650, "column": 13, - "stop_line": 1594, + "stop_line": 1650, "stop_column": 30, "path": "src/documents/views.py", "code": -2, @@ -10969,9 +9613,9 @@ "severity": "error" }, { - "line": 1632, + "line": 1688, "column": 36, - "stop_line": 1632, + "stop_line": 1688, "stop_column": 64, "path": "src/documents/views.py", "code": -2, @@ -10981,9 +9625,9 @@ "severity": "error" }, { - "line": 1672, + "line": 1728, "column": 30, - "stop_line": 1672, + "stop_line": 1728, "stop_column": 45, "path": "src/documents/views.py", "code": -2, @@ -10993,9 +9637,9 @@ "severity": "error" }, { - "line": 1841, + "line": 1897, "column": 13, - "stop_line": 1841, + "stop_line": 1897, "stop_column": 40, "path": "src/documents/views.py", "code": -2, @@ -11005,9 +9649,9 @@ "severity": "error" }, { - "line": 1920, + "line": 1976, "column": 13, - "stop_line": 1920, + "stop_line": 1976, "stop_column": 40, "path": "src/documents/views.py", "code": -2, @@ -11017,21 +9661,21 @@ "severity": "error" }, { - "line": 1996, + "line": 2052, "column": 70, - "stop_line": 1996, + "stop_line": 2052, "stop_column": 79, "path": "src/documents/views.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `QuerySet[Unknown] | list[Document]` is not assignable to parameter `documents` with type `list[Document]` in function `paperless_ai.chat.stream_chat_with_documents`", - "concise_description": "Argument `QuerySet[Unknown] | list[Document]` is not assignable to parameter `documents` with type `list[Document]` in function `paperless_ai.chat.stream_chat_with_documents`", + "description": "Argument `QuerySet[Any, Any] | list[Document]` is not assignable to parameter `documents` with type `list[Document]` in function `paperless_ai.chat.stream_chat_with_documents`", + "concise_description": "Argument `QuerySet[Any, Any] | list[Document]` is not assignable to parameter `documents` with type `list[Document]` in function `paperless_ai.chat.stream_chat_with_documents`", "severity": "error" }, { - "line": 2065, + "line": 2121, "column": 9, - "stop_line": 2065, + "stop_line": 2121, "stop_column": 13, "path": "src/documents/views.py", "code": -2, @@ -11041,9 +9685,33 @@ "severity": "error" }, { - "line": 2157, + "line": 2160, + "column": 17, + "stop_line": 2160, + "stop_column": 45, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BasePagination` has no attribute `get_page_size`\nObject of class `NoneType` has no attribute `get_page_size`", + "concise_description": "Object of class `BasePagination` has no attribute `get_page_size`\nObject of class `NoneType` has no attribute `get_page_size`", + "severity": "error" + }, + { + "line": 2160, + "column": 58, + "stop_line": 2160, + "stop_column": 82, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BasePagination` has no attribute `page_size`\nObject of class `NoneType` has no attribute `page_size`", + "concise_description": "Object of class `BasePagination` has no attribute `page_size`\nObject of class `NoneType` has no attribute `page_size`", + "severity": "error" + }, + { + "line": 2298, "column": 43, - "stop_line": 2157, + "stop_line": 2298, "stop_column": 45, "path": "src/documents/views.py", "code": -2, @@ -11053,9 +9721,9 @@ "severity": "error" }, { - "line": 2199, + "line": 2343, "column": 25, - "stop_line": 2199, + "stop_line": 2343, "stop_column": 36, "path": "src/documents/views.py", "code": -2, @@ -11065,9 +9733,9 @@ "severity": "error" }, { - "line": 2427, + "line": 2572, "column": 18, - "stop_line": 2427, + "stop_line": 2572, "stop_column": 35, "path": "src/documents/views.py", "code": -2, @@ -11077,9 +9745,9 @@ "severity": "error" }, { - "line": 2441, + "line": 2593, "column": 18, - "stop_line": 2441, + "stop_line": 2593, "stop_column": 22, "path": "src/documents/views.py", "code": -2, @@ -11089,9 +9757,9 @@ "severity": "error" }, { - "line": 2523, + "line": 2676, "column": 18, - "stop_line": 2523, + "stop_line": 2676, "stop_column": 22, "path": "src/documents/views.py", "code": -2, @@ -11101,9 +9769,9 @@ "severity": "error" }, { - "line": 2529, + "line": 2688, "column": 18, - "stop_line": 2529, + "stop_line": 2688, "stop_column": 22, "path": "src/documents/views.py", "code": -2, @@ -11113,9 +9781,9 @@ "severity": "error" }, { - "line": 2558, + "line": 2717, "column": 33, - "stop_line": 2558, + "stop_line": 2717, "stop_column": 46, "path": "src/documents/views.py", "code": -2, @@ -11125,9 +9793,9 @@ "severity": "error" }, { - "line": 2568, + "line": 2727, "column": 21, - "stop_line": 2568, + "stop_line": 2727, "stop_column": 48, "path": "src/documents/views.py", "code": -2, @@ -11137,9 +9805,9 @@ "severity": "error" }, { - "line": 2943, + "line": 3108, "column": 52, - "stop_line": 2943, + "stop_line": 3108, "stop_column": 68, "path": "src/documents/views.py", "code": -2, @@ -11149,9 +9817,9 @@ "severity": "error" }, { - "line": 2947, + "line": 3112, "column": 52, - "stop_line": 2947, + "stop_line": 3112, "stop_column": 68, "path": "src/documents/views.py", "code": -2, @@ -11161,9 +9829,9 @@ "severity": "error" }, { - "line": 2950, + "line": 3115, "column": 52, - "stop_line": 2950, + "stop_line": 3115, "stop_column": 68, "path": "src/documents/views.py", "code": -2, @@ -11173,9 +9841,9 @@ "severity": "error" }, { - "line": 2953, + "line": 3118, "column": 52, - "stop_line": 2953, + "stop_line": 3118, "stop_column": 68, "path": "src/documents/views.py", "code": -2, @@ -11185,9 +9853,9 @@ "severity": "error" }, { - "line": 2957, + "line": 3122, "column": 52, - "stop_line": 2957, + "stop_line": 3122, "stop_column": 68, "path": "src/documents/views.py", "code": -2, @@ -11197,9 +9865,9 @@ "severity": "error" }, { - "line": 3010, + "line": 3175, "column": 65, - "stop_line": 3010, + "stop_line": 3175, "stop_column": 69, "path": "src/documents/views.py", "code": -2, @@ -11209,33 +9877,45 @@ "severity": "error" }, { - "line": 3730, - "column": 32, - "stop_line": 3730, - "stop_column": 43, + "line": 3906, + "column": 9, + "stop_line": 3906, + "stop_column": 29, "path": "src/documents/views.py", "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `iter_wrapper` with type `(Iterable[Document]) -> Iterable[Document]` in function `celery.app.task.Task.__call__`", - "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `iter_wrapper` with type `(Iterable[Document]) -> Iterable[Document]` in function `celery.app.task.Task.__call__`", + "name": "bad-override", + "description": "Class member `TasksViewSet.get_serializer_class` overrides parent class `ReadOnlyModelViewSet` in an inconsistent manner\n `TasksViewSet.get_serializer_class` has type `(self: TasksViewSet) -> type[TaskSerializerV10] | type[TaskSerializerV9]`, which is not assignable to `(self: TasksViewSet) -> type[BaseSerializer[PaperlessTask]]`, the type of `ReadOnlyModelViewSet.get_serializer_class`\n Signature mismatch:\n expected: def get_serializer_class(self: TasksViewSet) -> type[BaseSerializer[PaperlessTask]]: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return type\n found: def get_serializer_class(self: TasksViewSet) -> type[TaskSerializerV10] | type[TaskSerializerV9]: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return type", + "concise_description": "Class member `TasksViewSet.get_serializer_class` overrides parent class `ReadOnlyModelViewSet` in an inconsistent manner", "severity": "error" }, { - "line": 3730, - "column": 32, - "stop_line": 3730, - "stop_column": 43, + "line": 3914, + "column": 12, + "stop_line": 3914, + "stop_column": 38, "path": "src/documents/views.py", "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `status_callback` with type `((str) -> None) | None` in function `celery.app.task.Task.__call__`", - "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `status_callback` with type `((str) -> None) | None` in function `celery.app.task.Task.__call__`", + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `is_staff`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_staff`", "severity": "error" }, { - "line": 4022, + "line": 3998, + "column": 44, + "stop_line": 3998, + "stop_column": 48, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `QuerySet[PaperlessTask, dict[str, Any]]` is not assignable to parameter `instance` with type `dict[str, Any] | None` in function `rest_framework.serializers.BaseSerializer.__init__`", + "concise_description": "Argument `QuerySet[PaperlessTask, dict[str, Any]]` is not assignable to parameter `instance` with type `dict[str, Any] | None` in function `rest_framework.serializers.BaseSerializer.__init__`", + "severity": "error" + }, + { + "line": 4352, "column": 24, - "stop_line": 4022, + "stop_line": 4352, "stop_column": 51, "path": "src/documents/views.py", "code": -2, @@ -11245,9 +9925,9 @@ "severity": "error" }, { - "line": 4041, + "line": 4371, "column": 17, - "stop_line": 4041, + "stop_line": 4371, "stop_column": 21, "path": "src/documents/views.py", "code": -2, @@ -11257,9 +9937,9 @@ "severity": "error" }, { - "line": 4066, + "line": 4396, "column": 16, - "stop_line": 4066, + "stop_line": 4396, "stop_column": 33, "path": "src/documents/views.py", "code": -2, @@ -11269,9 +9949,9 @@ "severity": "error" }, { - "line": 4068, + "line": 4398, "column": 25, - "stop_line": 4068, + "stop_line": 4398, "stop_column": 38, "path": "src/documents/views.py", "code": -2, @@ -11281,9 +9961,9 @@ "severity": "error" }, { - "line": 4123, + "line": 4453, "column": 9, - "stop_line": 4123, + "stop_line": 4453, "stop_column": 23, "path": "src/documents/views.py", "code": -2, @@ -11293,9 +9973,9 @@ "severity": "error" }, { - "line": 4148, + "line": 4478, "column": 9, - "stop_line": 4148, + "stop_line": 4478, "stop_column": 23, "path": "src/documents/views.py", "code": -2, @@ -11305,9 +9985,9 @@ "severity": "error" }, { - "line": 4324, + "line": 4690, "column": 36, - "stop_line": 4324, + "stop_line": 4690, "stop_column": 52, "path": "src/documents/views.py", "code": -2, @@ -11317,9 +9997,9 @@ "severity": "error" }, { - "line": 4325, + "line": 4691, "column": 33, - "stop_line": 4325, + "stop_line": 4691, "stop_column": 56, "path": "src/documents/views.py", "code": -2, @@ -11329,9 +10009,9 @@ "severity": "error" }, { - "line": 4446, + "line": 4816, "column": 40, - "stop_line": 4446, + "stop_line": 4816, "stop_column": 54, "path": "src/documents/views.py", "code": -2, @@ -11341,9 +10021,9 @@ "severity": "error" }, { - "line": 4454, + "line": 4824, "column": 38, - "stop_line": 4454, + "stop_line": 4824, "stop_column": 51, "path": "src/documents/views.py", "code": -2, @@ -11353,9 +10033,9 @@ "severity": "error" }, { - "line": 4523, + "line": 4893, "column": 16, - "stop_line": 4523, + "stop_line": 4893, "stop_column": 31, "path": "src/documents/views.py", "code": -2, @@ -11713,10 +10393,10 @@ "severity": "error" }, { - "line": 257, - "column": 17, - "stop_line": 257, - "stop_column": 35, + "line": 258, + "column": 24, + "stop_line": 258, + "stop_column": 42, "path": "src/documents/workflows/actions.py", "code": -2, "name": "missing-attribute", @@ -11725,22 +10405,10 @@ "severity": "error" }, { - "line": 260, - "column": 19, - "stop_line": 260, - "stop_column": 24, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `dict[str, tuple[str, bytes, str]] | None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.delay`", - "concise_description": "Argument `dict[str, tuple[str, bytes, str]] | None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.delay`", - "severity": "error" - }, - { - "line": 261, - "column": 21, - "stop_line": 261, - "stop_column": 43, + "line": 262, + "column": 28, + "stop_line": 262, + "stop_column": 50, "path": "src/documents/workflows/actions.py", "code": -2, "name": "missing-attribute", @@ -11749,9 +10417,9 @@ "severity": "error" }, { - "line": 264, + "line": 266, "column": 27, - "stop_line": 264, + "stop_line": 266, "stop_column": 45, "path": "src/documents/workflows/actions.py", "code": -2, @@ -11761,9 +10429,9 @@ "severity": "error" }, { - "line": 300, + "line": 302, "column": 43, - "stop_line": 300, + "stop_line": 302, "stop_column": 65, "path": "src/documents/workflows/actions.py", "code": -2, @@ -11773,9 +10441,9 @@ "severity": "error" }, { - "line": 27, + "line": 26, "column": 8, - "stop_line": 27, + "stop_line": 26, "stop_column": 30, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11785,9 +10453,9 @@ "severity": "error" }, { - "line": 70, + "line": 64, "column": 13, - "stop_line": 70, + "stop_line": 64, "stop_column": 41, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11797,9 +10465,9 @@ "severity": "error" }, { - "line": 71, + "line": 65, "column": 13, - "stop_line": 71, + "stop_line": 65, "stop_column": 42, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11809,9 +10477,9 @@ "severity": "error" }, { - "line": 72, + "line": 66, "column": 13, - "stop_line": 72, + "stop_line": 66, "stop_column": 43, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11821,9 +10489,9 @@ "severity": "error" }, { - "line": 73, + "line": 67, "column": 13, - "stop_line": 73, + "stop_line": 67, "stop_column": 44, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11833,9 +10501,9 @@ "severity": "error" }, { - "line": 92, + "line": 86, "column": 8, - "stop_line": 92, + "stop_line": 86, "stop_column": 39, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11845,9 +10513,9 @@ "severity": "error" }, { - "line": 95, + "line": 89, "column": 27, - "stop_line": 95, + "stop_line": 89, "stop_column": 42, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11857,9 +10525,9 @@ "severity": "error" }, { - "line": 98, + "line": 92, "column": 35, - "stop_line": 98, + "stop_line": 92, "stop_column": 73, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11869,9 +10537,9 @@ "severity": "error" }, { - "line": 128, + "line": 122, "column": 8, - "stop_line": 128, + "stop_line": 122, "stop_column": 30, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11881,9 +10549,9 @@ "severity": "error" }, { - "line": 155, + "line": 149, "column": 13, - "stop_line": 155, + "stop_line": 149, "stop_column": 41, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11893,9 +10561,9 @@ "severity": "error" }, { - "line": 156, + "line": 150, "column": 13, - "stop_line": 156, + "stop_line": 150, "stop_column": 42, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11905,9 +10573,9 @@ "severity": "error" }, { - "line": 157, + "line": 151, "column": 13, - "stop_line": 157, + "stop_line": 151, "stop_column": 43, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11917,9 +10585,9 @@ "severity": "error" }, { - "line": 158, + "line": 152, "column": 13, - "stop_line": 158, + "stop_line": 152, "stop_column": 44, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11929,9 +10597,9 @@ "severity": "error" }, { - "line": 186, + "line": 180, "column": 8, - "stop_line": 186, + "stop_line": 180, "stop_column": 39, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11941,9 +10609,9 @@ "severity": "error" }, { - "line": 191, + "line": 185, "column": 27, - "stop_line": 191, + "stop_line": 185, "stop_column": 65, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11953,9 +10621,9 @@ "severity": "error" }, { - "line": 257, + "line": 251, "column": 13, - "stop_line": 257, + "stop_line": 251, "stop_column": 41, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11965,9 +10633,9 @@ "severity": "error" }, { - "line": 258, + "line": 252, "column": 13, - "stop_line": 258, + "stop_line": 252, "stop_column": 42, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11977,9 +10645,9 @@ "severity": "error" }, { - "line": 259, + "line": 253, "column": 13, - "stop_line": 259, + "stop_line": 253, "stop_column": 43, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -11989,9 +10657,9 @@ "severity": "error" }, { - "line": 260, + "line": 254, "column": 13, - "stop_line": 260, + "stop_line": 254, "stop_column": 44, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12001,9 +10669,9 @@ "severity": "error" }, { - "line": 273, + "line": 267, "column": 9, - "stop_line": 273, + "stop_line": 267, "stop_column": 74, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12013,9 +10681,9 @@ "severity": "error" }, { - "line": 274, + "line": 268, "column": 10, - "stop_line": 274, + "stop_line": 268, "stop_column": 41, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12025,9 +10693,9 @@ "severity": "error" }, { - "line": 275, + "line": 269, "column": 9, - "stop_line": 278, + "stop_line": 272, "stop_column": 22, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12037,9 +10705,9 @@ "severity": "error" }, { - "line": 331, + "line": 325, "column": 13, - "stop_line": 331, + "stop_line": 325, "stop_column": 41, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12049,9 +10717,9 @@ "severity": "error" }, { - "line": 332, + "line": 326, "column": 13, - "stop_line": 332, + "stop_line": 326, "stop_column": 42, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12061,9 +10729,9 @@ "severity": "error" }, { - "line": 333, + "line": 327, "column": 13, - "stop_line": 333, + "stop_line": 327, "stop_column": 43, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12073,9 +10741,9 @@ "severity": "error" }, { - "line": 334, + "line": 328, "column": 13, - "stop_line": 334, + "stop_line": 328, "stop_column": 44, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12085,9 +10753,9 @@ "severity": "error" }, { - "line": 356, + "line": 350, "column": 10, - "stop_line": 356, + "stop_line": 350, "stop_column": 41, "path": "src/documents/workflows/mutations.py", "code": -2, @@ -12241,9 +10909,9 @@ "severity": "error" }, { - "line": 93, + "line": 91, "column": 12, - "stop_line": 93, + "stop_line": 91, "stop_column": 26, "path": "src/paperless/checks.py", "code": -2, @@ -12253,9 +10921,9 @@ "severity": "error" }, { - "line": 179, + "line": 177, "column": 9, - "stop_line": 181, + "stop_line": 179, "stop_column": 40, "path": "src/paperless/checks.py", "code": -2, @@ -12265,9 +10933,9 @@ "severity": "error" }, { - "line": 198, + "line": 196, "column": 12, - "stop_line": 198, + "stop_line": 196, "stop_column": 18, "path": "src/paperless/checks.py", "code": -2, @@ -12277,9 +10945,9 @@ "severity": "error" }, { - "line": 347, + "line": 345, "column": 26, - "stop_line": 350, + "stop_line": 348, "stop_column": 6, "path": "src/paperless/checks.py", "code": -2, @@ -12289,9 +10957,9 @@ "severity": "error" }, { - "line": 369, + "line": 367, "column": 16, - "stop_line": 369, + "stop_line": 367, "stop_column": 20, "path": "src/paperless/checks.py", "code": -2, @@ -12301,9 +10969,9 @@ "severity": "error" }, { - "line": 381, + "line": 379, "column": 21, - "stop_line": 385, + "stop_line": 383, "stop_column": 22, "path": "src/paperless/checks.py", "code": -2, @@ -12313,9 +10981,9 @@ "severity": "error" }, { - "line": 388, + "line": 386, "column": 12, - "stop_line": 388, + "stop_line": 386, "stop_column": 16, "path": "src/paperless/checks.py", "code": -2, @@ -12339,67 +11007,67 @@ { "line": 41, "column": 28, - "stop_line": 41, - "stop_column": 78, + "stop_line": 43, + "stop_column": 10, "path": "src/paperless/config.py", "code": -2, "name": "bad-assignment", - "description": "`str | Any` is not assignable to attribute `output_type` with type `OutputTypeChoices`", - "concise_description": "`str | Any` is not assignable to attribute `output_type` with type `OutputTypeChoices`", - "severity": "error" - }, - { - "line": 73, - "column": 21, - "stop_line": 73, - "stop_column": 57, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`str | Any` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`str | Any` is not assignable to attribute `mode` with type `ModeChoices`", + "description": "`OutputTypeChoices | str` is not assignable to attribute `output_type` with type `OutputTypeChoices`", + "concise_description": "`OutputTypeChoices | str` is not assignable to attribute `output_type` with type `OutputTypeChoices`", "severity": "error" }, { "line": 75, - "column": 13, + "column": 21, "stop_line": 75, - "stop_column": 83, + "stop_column": 70, "path": "src/paperless/config.py", "code": -2, "name": "bad-assignment", - "description": "`str | Any` is not assignable to attribute `archive_file_generation` with type `ArchiveFileGenerationChoices`", - "concise_description": "`str | Any` is not assignable to attribute `archive_file_generation` with type `ArchiveFileGenerationChoices`", + "description": "`ModeChoices | str` is not assignable to attribute `mode` with type `ModeChoices`", + "concise_description": "`ModeChoices | str` is not assignable to attribute `mode` with type `ModeChoices`", "severity": "error" }, { - "line": 78, - "column": 22, - "stop_line": 78, - "stop_column": 68, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`str | Any` is not assignable to attribute `clean` with type `CleanChoices`", - "concise_description": "`str | Any` is not assignable to attribute `clean` with type `CleanChoices`", - "severity": "error" - }, - { - "line": 94, + "line": 77, "column": 13, - "stop_line": 95, - "stop_column": 54, + "stop_line": 78, + "stop_column": 78, "path": "src/paperless/config.py", "code": -2, "name": "bad-assignment", - "description": "`str | Any` is not assignable to attribute `color_conversion_strategy` with type `ColorConvertChoices`", - "concise_description": "`str | Any` is not assignable to attribute `color_conversion_strategy` with type `ColorConvertChoices`", + "description": "`ArchiveFileGenerationChoices | str` is not assignable to attribute `archive_file_generation` with type `ArchiveFileGenerationChoices`", + "concise_description": "`ArchiveFileGenerationChoices | str` is not assignable to attribute `archive_file_generation` with type `ArchiveFileGenerationChoices`", "severity": "error" }, { - "line": 181, + "line": 81, + "column": 22, + "stop_line": 81, + "stop_column": 82, + "path": "src/paperless/config.py", + "code": -2, + "name": "bad-assignment", + "description": "`CleanChoices | str` is not assignable to attribute `clean` with type `CleanChoices`", + "concise_description": "`CleanChoices | str` is not assignable to attribute `clean` with type `CleanChoices`", + "severity": "error" + }, + { + "line": 97, + "column": 13, + "stop_line": 98, + "stop_column": 75, + "path": "src/paperless/config.py", + "code": -2, + "name": "bad-assignment", + "description": "`ColorConvertChoices | str` is not assignable to attribute `color_conversion_strategy` with type `ColorConvertChoices`", + "concise_description": "`ColorConvertChoices | str` is not assignable to attribute `color_conversion_strategy` with type `ColorConvertChoices`", + "severity": "error" + }, + { + "line": 184, "column": 26, - "stop_line": 181, + "stop_line": 184, "stop_column": 54, "path": "src/paperless/config.py", "code": -2, @@ -12409,9 +11077,9 @@ "severity": "error" }, { - "line": 182, + "line": 185, "column": 25, - "stop_line": 182, + "stop_line": 185, "stop_column": 81, "path": "src/paperless/config.py", "code": -2, @@ -12517,51 +11185,51 @@ "severity": "error" }, { - "line": 92, - "column": 11, - "stop_line": 92, - "stop_column": 15, + "line": 93, + "column": 17, + "stop_line": 93, + "stop_column": 21, "path": "src/paperless/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `UserSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `UserSerializer.Meta` has type `type[UserSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `UserSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 152, - "column": 11, - "stop_line": 152, - "stop_column": 15, + "line": 153, + "column": 17, + "stop_line": 153, + "stop_column": 22, "path": "src/paperless/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `GroupSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `GroupSerializer.Meta` has type `type[GroupSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `GroupSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[Group]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[Group]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 164, - "column": 11, - "stop_line": 164, - "stop_column": 15, + "line": 165, + "column": 17, + "stop_line": 165, + "stop_column": 30, "path": "src/paperless/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `SocialAccountSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `SocialAccountSerializer.Meta` has type `type[SocialAccountSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `SocialAccountSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[SocialAccount]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[SocialAccount]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 198, - "column": 11, - "stop_line": 198, - "stop_column": 15, + "line": 199, + "column": 17, + "stop_line": 199, + "stop_column": 21, "path": "src/paperless/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `ProfileSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `ProfileSerializer.Meta` has type `type[ProfileSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `ProfileSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { @@ -12589,21 +11257,21 @@ "severity": "error" }, { - "line": 294, - "column": 11, - "stop_line": 294, - "stop_column": 15, + "line": 295, + "column": 17, + "stop_line": 295, + "stop_column": 41, "path": "src/paperless/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `ApplicationConfigurationSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner\n `ApplicationConfigurationSerializer.Meta` has type `type[ApplicationConfigurationSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `ModelSerializer.Meta`", - "concise_description": "Class member `ApplicationConfigurationSerializer.Meta` overrides parent class `ModelSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[ApplicationConfiguration]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[ApplicationConfiguration]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 278, + "line": 277, "column": 43, - "stop_line": 283, + "stop_line": 282, "stop_column": 6, "path": "src/paperless/settings/__init__.py", "code": -2, @@ -12613,9 +11281,9 @@ "severity": "error" }, { - "line": 449, + "line": 448, "column": 30, - "stop_line": 449, + "stop_line": 448, "stop_column": 52, "path": "src/paperless/settings/__init__.py", "code": -2, @@ -12625,9 +11293,9 @@ "severity": "error" }, { - "line": 1015, + "line": 1012, "column": 39, - "stop_line": 1015, + "stop_line": 1012, "stop_column": 74, "path": "src/paperless/settings/__init__.py", "code": -2, @@ -12660,6 +11328,18 @@ "concise_description": "Object of class `dict` has no attribute `split`", "severity": "error" }, + { + "line": 185, + "column": 19, + "stop_line": 185, + "stop_column": 34, + "path": "src/paperless/settings/custom.py", + "code": -2, + "name": "invalid-argument", + "description": "Expected a mapping, got dict[str, float] | str", + "concise_description": "Expected a mapping, got dict[str, float] | str", + "severity": "error" + }, { "line": 771, "column": 12, @@ -12733,105 +11413,9 @@ "severity": "error" }, { - "line": 75, + "line": 401, "column": 42, - "stop_line": 75, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 109, - "column": 42, - "stop_line": 109, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 161, - "column": 42, - "stop_line": 161, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 203, - "column": 42, - "stop_line": 203, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 246, - "column": 42, - "stop_line": 246, - "stop_column": 47, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 286, - "column": 42, - "stop_line": 286, - "stop_column": 47, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 326, - "column": 42, - "stop_line": 326, - "stop_column": 47, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 358, - "column": 42, - "stop_line": 358, - "stop_column": 47, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 399, - "column": 42, - "stop_line": 399, + "stop_line": 401, "stop_column": 46, "path": "src/paperless/tests/parsers/test_parse_modes.py", "code": -2, @@ -12840,18 +11424,6 @@ "concise_description": "`str` is not assignable to attribute `mode` with type `ModeChoices`", "severity": "error" }, - { - "line": 432, - "column": 42, - "stop_line": 432, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, { "line": 77, "column": 34, @@ -12901,105 +11473,9 @@ "severity": "error" }, { - "line": 47, - "column": 13, - "stop_line": 47, - "stop_column": 27, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `pages`", - "concise_description": "Object of class `NoneType` has no attribute `pages`", - "severity": "error" - }, - { - "line": 48, - "column": 13, - "stop_line": 48, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 65, - "column": 13, - "stop_line": 65, - "stop_column": 30, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `language`", - "concise_description": "Object of class `NoneType` has no attribute `language`", - "severity": "error" - }, - { - "line": 66, - "column": 13, - "stop_line": 66, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 83, - "column": 13, - "stop_line": 83, - "stop_column": 33, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `output_type`", - "concise_description": "Object of class `NoneType` has no attribute `output_type`", - "severity": "error" - }, - { - "line": 84, - "column": 13, - "stop_line": 84, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 103, - "column": 13, - "stop_line": 103, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `mode`", - "concise_description": "Object of class `NoneType` has no attribute `mode`", - "severity": "error" - }, - { - "line": 104, - "column": 13, - "stop_line": 104, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 107, + "line": 111, "column": 28, - "stop_line": 107, + "stop_line": 111, "stop_column": 39, "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", "code": -2, @@ -13009,9 +11485,9 @@ "severity": "error" }, { - "line": 108, + "line": 112, "column": 29, - "stop_line": 108, + "stop_line": 112, "stop_column": 41, "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", "code": -2, @@ -13021,9 +11497,9 @@ "severity": "error" }, { - "line": 109, + "line": 113, "column": 30, - "stop_line": 109, + "stop_line": 113, "stop_column": 43, "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", "code": -2, @@ -13033,177 +11509,9 @@ "severity": "error" }, { - "line": 121, - "column": 13, - "stop_line": 121, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `mode`", - "concise_description": "Object of class `NoneType` has no attribute `mode`", - "severity": "error" - }, - { - "line": 122, - "column": 13, - "stop_line": 122, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 141, - "column": 13, - "stop_line": 141, - "stop_column": 35, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `unpaper_clean`", - "concise_description": "Object of class `NoneType` has no attribute `unpaper_clean`", - "severity": "error" - }, - { - "line": 142, - "column": 13, - "stop_line": 142, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 150, - "column": 13, - "stop_line": 150, - "stop_column": 35, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `unpaper_clean`", - "concise_description": "Object of class `NoneType` has no attribute `unpaper_clean`", - "severity": "error" - }, - { - "line": 151, - "column": 13, - "stop_line": 151, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 169, - "column": 13, - "stop_line": 169, - "stop_column": 28, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `deskew`", - "concise_description": "Object of class `NoneType` has no attribute `deskew`", - "severity": "error" - }, - { - "line": 170, - "column": 13, - "stop_line": 170, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 208, - "column": 13, - "stop_line": 208, - "stop_column": 38, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `max_image_pixels`", - "concise_description": "Object of class `NoneType` has no attribute `max_image_pixels`", - "severity": "error" - }, - { - "line": 209, - "column": 13, - "stop_line": 209, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 226, - "column": 13, - "stop_line": 226, - "stop_column": 47, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `color_conversion_strategy`", - "concise_description": "Object of class `NoneType` has no attribute `color_conversion_strategy`", - "severity": "error" - }, - { - "line": 227, - "column": 13, - "stop_line": 227, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 249, - "column": 13, - "stop_line": 249, - "stop_column": 31, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `user_args`", - "concise_description": "Object of class `NoneType` has no attribute `user_args`", - "severity": "error" - }, - { - "line": 250, - "column": 13, - "stop_line": 250, - "stop_column": 26, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 278, + "line": 279, "column": 38, - "stop_line": 278, + "stop_line": 279, "stop_column": 75, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13213,9 +11521,9 @@ "severity": "error" }, { - "line": 289, + "line": 290, "column": 17, - "stop_line": 289, + "stop_line": 290, "stop_column": 65, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13225,21 +11533,9 @@ "severity": "error" }, { - "line": 391, + "line": 410, "column": 13, - "stop_line": 391, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 407, - "column": 13, - "stop_line": 407, + "stop_line": 410, "stop_column": 40, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13249,141 +11545,69 @@ "severity": "error" }, { - "line": 416, + "line": 427, + "column": 13, + "stop_line": 427, + "stop_column": 40, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "severity": "error" + }, + { + "line": 442, + "column": 13, + "stop_line": 442, + "stop_column": 40, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "severity": "error" + }, + { + "line": 455, + "column": 13, + "stop_line": 455, + "stop_column": 40, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "severity": "error" + }, + { + "line": 507, + "column": 13, + "stop_line": 507, + "stop_column": 40, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "severity": "error" + }, + { + "line": 523, + "column": 13, + "stop_line": 523, + "stop_column": 40, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", + "severity": "error" + }, + { + "line": 593, "column": 42, - "stop_line": 416, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['redo']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['redo']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 424, - "column": 13, - "stop_line": 424, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 433, - "column": 42, - "stop_line": 433, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['force']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['force']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 439, - "column": 13, - "stop_line": 439, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 448, - "column": 42, - "stop_line": 448, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 452, - "column": 13, - "stop_line": 452, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 464, - "column": 42, - "stop_line": 464, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 504, - "column": 13, - "stop_line": 504, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 520, - "column": 13, - "stop_line": 520, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 533, - "column": 46, - "stop_line": 533, - "stop_column": 79, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 567, - "column": 13, - "stop_line": 567, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 586, - "column": 42, - "stop_line": 586, + "stop_line": 593, "stop_column": 46, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13393,309 +11617,9 @@ "severity": "error" }, { - "line": 593, + "line": 1053, "column": 13, - "stop_line": 593, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 602, - "column": 42, - "stop_line": 602, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 609, - "column": 13, - "stop_line": 609, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 629, - "column": 42, - "stop_line": 629, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['redo']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['redo']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 635, - "column": 16, - "stop_line": 635, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 655, - "column": 42, - "stop_line": 655, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['force']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['force']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 661, - "column": 16, - "stop_line": 661, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 685, - "column": 13, - "stop_line": 685, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 708, - "column": 13, - "stop_line": 708, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 731, - "column": 13, - "stop_line": 731, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 757, - "column": 42, - "stop_line": 757, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 765, - "column": 13, - "stop_line": 765, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 783, - "column": 42, - "stop_line": 783, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 790, - "column": 13, - "stop_line": 790, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 841, - "column": 42, - "stop_line": 841, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 847, - "column": 16, - "stop_line": 847, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 871, - "column": 42, - "stop_line": 871, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 898, - "column": 42, - "stop_line": 898, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 928, - "column": 42, - "stop_line": 928, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 936, - "column": 13, - "stop_line": 936, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 956, - "column": 42, - "stop_line": 956, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['redo']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['redo']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 964, - "column": 13, - "stop_line": 964, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 992, - "column": 42, - "stop_line": 992, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 1000, - "column": 13, - "stop_line": 1000, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 1016, - "column": 42, - "stop_line": 1016, - "stop_column": 48, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['auto']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 1020, - "column": 13, - "stop_line": 1020, + "stop_line": 1053, "stop_column": 40, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13705,33 +11629,9 @@ "severity": "error" }, { - "line": 1055, - "column": 42, - "stop_line": 1055, - "stop_column": 47, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`Literal['off']` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 1062, - "column": 53, - "stop_line": 1062, - "stop_column": 80, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `unistr` with type `str` in function `unicodedata.normalize`", - "concise_description": "Argument `str | None` is not assignable to parameter `unistr` with type `str` in function `unicodedata.normalize`", - "severity": "error" - }, - { - "line": 1087, + "line": 1122, "column": 14, - "stop_line": 1087, + "stop_line": 1122, "stop_column": 37, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13741,9 +11641,9 @@ "severity": "error" }, { - "line": 1087, + "line": 1122, "column": 14, - "stop_line": 1087, + "stop_line": 1122, "stop_column": 37, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13753,9 +11653,9 @@ "severity": "error" }, { - "line": 1114, + "line": 1149, "column": 14, - "stop_line": 1114, + "stop_line": 1149, "stop_column": 56, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13765,9 +11665,9 @@ "severity": "error" }, { - "line": 1114, + "line": 1149, "column": 14, - "stop_line": 1114, + "stop_line": 1149, "stop_column": 56, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13777,9 +11677,9 @@ "severity": "error" }, { - "line": 1123, + "line": 1158, "column": 14, - "stop_line": 1123, + "stop_line": 1158, "stop_column": 77, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13789,9 +11689,9 @@ "severity": "error" }, { - "line": 1123, + "line": 1158, "column": 14, - "stop_line": 1123, + "stop_line": 1158, "stop_column": 77, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13801,9 +11701,9 @@ "severity": "error" }, { - "line": 1132, + "line": 1167, "column": 14, - "stop_line": 1132, + "stop_line": 1167, "stop_column": 77, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13813,9 +11713,9 @@ "severity": "error" }, { - "line": 1132, + "line": 1167, "column": 14, - "stop_line": 1132, + "stop_line": 1167, "stop_column": 77, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13825,9 +11725,9 @@ "severity": "error" }, { - "line": 1153, + "line": 1188, "column": 14, - "stop_line": 1153, + "stop_line": 1188, "stop_column": 77, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13837,9 +11737,9 @@ "severity": "error" }, { - "line": 1153, + "line": 1188, "column": 14, - "stop_line": 1153, + "stop_line": 1188, "stop_column": 77, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13849,9 +11749,9 @@ "severity": "error" }, { - "line": 1161, + "line": 1196, "column": 14, - "stop_line": 1161, + "stop_line": 1196, "stop_column": 69, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13861,9 +11761,9 @@ "severity": "error" }, { - "line": 1161, + "line": 1196, "column": 14, - "stop_line": 1161, + "stop_line": 1196, "stop_column": 69, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13873,9 +11773,9 @@ "severity": "error" }, { - "line": 1170, + "line": 1205, "column": 14, - "stop_line": 1170, + "stop_line": 1205, "stop_column": 70, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13885,9 +11785,9 @@ "severity": "error" }, { - "line": 1170, + "line": 1205, "column": 14, - "stop_line": 1170, + "stop_line": 1205, "stop_column": 70, "path": "src/paperless/tests/parsers/test_tesseract_parser.py", "code": -2, @@ -13896,54 +11796,6 @@ "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", "severity": "error" }, - { - "line": 1199, - "column": 45, - "stop_line": 1199, - "stop_column": 78, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 1208, - "column": 27, - "stop_line": 1208, - "stop_column": 60, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 1218, - "column": 45, - "stop_line": 1218, - "stop_column": 78, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 1230, - "column": 13, - "stop_line": 1230, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `lower`", - "concise_description": "Object of class `NoneType` has no attribute `lower`", - "severity": "error" - }, { "line": 115, "column": 19, @@ -13952,7 +11804,7 @@ "path": "src/paperless/tests/parsers/test_tika_parser.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, @@ -14281,9 +12133,9 @@ "severity": "error" }, { - "line": 76, + "line": 77, "column": 23, - "stop_line": 76, + "stop_line": 77, "stop_column": 42, "path": "src/paperless/views.py", "code": -2, @@ -14293,9 +12145,9 @@ "severity": "error" }, { - "line": 91, + "line": 92, "column": 17, - "stop_line": 91, + "stop_line": 92, "stop_column": 36, "path": "src/paperless/views.py", "code": -2, @@ -14305,9 +12157,9 @@ "severity": "error" }, { - "line": 94, + "line": 95, "column": 16, - "stop_line": 94, + "stop_line": 95, "stop_column": 35, "path": "src/paperless/views.py", "code": -2, @@ -14317,9 +12169,9 @@ "severity": "error" }, { - "line": 143, + "line": 144, "column": 9, - "stop_line": 143, + "stop_line": 144, "stop_column": 15, "path": "src/paperless/views.py", "code": -2, @@ -14329,9 +12181,9 @@ "severity": "error" }, { - "line": 162, + "line": 163, "column": 9, - "stop_line": 162, + "stop_line": 163, "stop_column": 15, "path": "src/paperless/views.py", "code": -2, @@ -14341,9 +12193,9 @@ "severity": "error" }, { - "line": 254, + "line": 255, "column": 13, - "stop_line": 254, + "stop_line": 255, "stop_column": 30, "path": "src/paperless/views.py", "code": -2, @@ -14353,9 +12205,9 @@ "severity": "error" }, { - "line": 255, + "line": 256, "column": 13, - "stop_line": 255, + "stop_line": 256, "stop_column": 22, "path": "src/paperless/views.py", "code": -2, @@ -14365,9 +12217,9 @@ "severity": "error" }, { - "line": 259, + "line": 260, "column": 9, - "stop_line": 259, + "stop_line": 260, "stop_column": 18, "path": "src/paperless/views.py", "code": -2, @@ -14377,9 +12229,9 @@ "severity": "error" }, { - "line": 336, + "line": 337, "column": 38, - "stop_line": 336, + "stop_line": 337, "stop_column": 75, "path": "src/paperless/views.py", "code": -2, @@ -14389,9 +12241,9 @@ "severity": "error" }, { - "line": 338, + "line": 339, "column": 34, - "stop_line": 338, + "stop_line": 339, "stop_column": 65, "path": "src/paperless/views.py", "code": -2, @@ -14401,9 +12253,9 @@ "severity": "error" }, { - "line": 416, + "line": 417, "column": 13, - "stop_line": 416, + "stop_line": 417, "stop_column": 36, "path": "src/paperless/views.py", "code": -2, @@ -14413,9 +12265,9 @@ "severity": "error" }, { - "line": 416, + "line": 417, "column": 41, - "stop_line": 416, + "stop_line": 417, "stop_column": 75, "path": "src/paperless/views.py", "code": -2, @@ -14485,9 +12337,9 @@ "severity": "error" }, { - "line": 259, + "line": 261, "column": 46, - "stop_line": 259, + "stop_line": 261, "stop_column": 51, "path": "src/paperless_ai/indexing.py", "code": -2, @@ -14497,9 +12349,9 @@ "severity": "error" }, { - "line": 272, + "line": 274, "column": 46, - "stop_line": 272, + "stop_line": 274, "stop_column": 51, "path": "src/paperless_ai/indexing.py", "code": -2, @@ -14509,9 +12361,9 @@ "severity": "error" }, { - "line": 329, + "line": 331, "column": 15, - "stop_line": 329, + "stop_line": 331, "stop_column": 20, "path": "src/paperless_ai/indexing.py", "code": -2, @@ -14629,9 +12481,9 @@ "severity": "error" }, { - "line": 167, + "line": 168, "column": 26, - "stop_line": 167, + "stop_line": 168, "stop_column": 30, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14641,9 +12493,9 @@ "severity": "error" }, { - "line": 184, + "line": 185, "column": 64, - "stop_line": 184, + "stop_line": 185, "stop_column": 76, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14653,21 +12505,21 @@ "severity": "error" }, { - "line": 196, + "line": 197, "column": 33, - "stop_line": 196, + "stop_line": 197, "stop_column": 70, "path": "src/paperless_mail/mail.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `list[str] | list[Unknown] | None` is not assignable to parameter `flag_set` with type `Iterable[str] | str` in function `imap_tools.mailbox.BaseMailBox.flag`", + "description": "Argument `list[str] | list[Unknown] | None` is not assignable to parameter `flag_set` with type `Iterable[str] | str` in function `imap_tools.mailbox.BaseMailBox.flag`\n Protocol `Iterable` requires attribute `__iter__`", "concise_description": "Argument `list[str] | list[Unknown] | None` is not assignable to parameter `flag_set` with type `Iterable[str] | str` in function `imap_tools.mailbox.BaseMailBox.flag`", "severity": "error" }, { - "line": 274, + "line": 275, "column": 53, - "stop_line": 274, + "stop_line": 275, "stop_column": 74, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14677,9 +12529,9 @@ "severity": "error" }, { - "line": 375, + "line": 376, "column": 13, - "stop_line": 375, + "stop_line": 376, "stop_column": 34, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14689,9 +12541,9 @@ "severity": "error" }, { - "line": 392, + "line": 393, "column": 30, - "stop_line": 392, + "stop_line": 393, "stop_column": 46, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14701,9 +12553,9 @@ "severity": "error" }, { - "line": 394, + "line": 395, "column": 27, - "stop_line": 394, + "stop_line": 395, "stop_column": 41, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14713,9 +12565,9 @@ "severity": "error" }, { - "line": 396, + "line": 397, "column": 32, - "stop_line": 396, + "stop_line": 397, "stop_column": 51, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14725,9 +12577,9 @@ "severity": "error" }, { - "line": 398, + "line": 399, "column": 29, - "stop_line": 398, + "stop_line": 399, "stop_column": 45, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14737,9 +12589,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14749,9 +12601,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14761,9 +12613,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14773,9 +12625,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14785,9 +12637,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14797,9 +12649,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14809,9 +12661,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14821,9 +12673,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14833,9 +12685,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14845,9 +12697,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14857,9 +12709,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14869,9 +12721,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14881,9 +12733,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14893,9 +12745,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14905,9 +12757,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14917,9 +12769,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14929,9 +12781,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14941,9 +12793,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14953,9 +12805,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14965,9 +12817,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -14977,21 +12829,21 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`\n Protocol `Iterable` requires attribute `__iter__`", "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15001,9 +12853,9 @@ "severity": "error" }, { - "line": 406, + "line": 407, "column": 38, - "stop_line": 406, + "stop_line": 407, "stop_column": 49, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15013,9 +12865,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15025,9 +12877,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15037,9 +12889,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15049,9 +12901,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15061,9 +12913,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15073,9 +12925,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15085,9 +12937,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15097,9 +12949,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15109,9 +12961,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15121,9 +12973,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15133,9 +12985,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15145,9 +12997,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15157,9 +13009,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15169,9 +13021,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15181,9 +13033,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15193,9 +13045,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15205,9 +13057,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15217,9 +13069,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15229,9 +13081,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15241,9 +13093,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15253,21 +13105,21 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`\n Protocol `Iterable` requires attribute `__iter__`", "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15277,9 +13129,9 @@ "severity": "error" }, { - "line": 410, + "line": 411, "column": 32, - "stop_line": 410, + "stop_line": 411, "stop_column": 43, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15289,9 +13141,9 @@ "severity": "error" }, { - "line": 436, + "line": 437, "column": 12, - "stop_line": 436, + "stop_line": 437, "stop_column": 19, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15301,9 +13153,9 @@ "severity": "error" }, { - "line": 575, + "line": 577, "column": 54, - "stop_line": 575, + "stop_line": 577, "stop_column": 67, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15313,9 +13165,9 @@ "severity": "error" }, { - "line": 578, + "line": 580, "column": 29, - "stop_line": 578, + "stop_line": 580, "stop_column": 42, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15325,9 +13177,9 @@ "severity": "error" }, { - "line": 624, + "line": 626, "column": 31, - "stop_line": 624, + "stop_line": 626, "stop_column": 52, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15337,9 +13189,9 @@ "severity": "error" }, { - "line": 631, + "line": 633, "column": 44, - "stop_line": 631, + "stop_line": 633, "stop_column": 50, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15349,9 +13201,9 @@ "severity": "error" }, { - "line": 960, + "line": 966, "column": 40, - "stop_line": 960, + "stop_line": 966, "stop_column": 60, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15361,9 +13213,9 @@ "severity": "error" }, { - "line": 964, + "line": 970, "column": 32, - "stop_line": 964, + "stop_line": 970, "stop_column": 52, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15373,9 +13225,9 @@ "severity": "error" }, { - "line": 965, + "line": 971, "column": 32, - "stop_line": 965, + "stop_line": 971, "stop_column": 52, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15385,9 +13237,9 @@ "severity": "error" }, { - "line": 966, + "line": 972, "column": 17, - "stop_line": 966, + "stop_line": 972, "stop_column": 37, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15397,9 +13249,9 @@ "severity": "error" }, { - "line": 980, + "line": 986, "column": 27, - "stop_line": 980, + "stop_line": 986, "stop_column": 40, "path": "src/paperless_mail/mail.py", "code": -2, @@ -15457,45 +13309,657 @@ "severity": "error" }, { - "line": 30, - "column": 11, - "stop_line": 30, - "stop_column": 15, + "line": 31, + "column": 17, + "stop_line": 31, + "stop_column": 28, "path": "src/paperless_mail/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `MailAccountSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `MailAccountSerializer.Meta` has type `type[MailAccountSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `MailAccountSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[MailAccount]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[MailAccount]` is not assignable to attribute `model` with type `type[_MT]`", "severity": "error" }, { - "line": 77, - "column": 11, - "stop_line": 77, - "stop_column": 15, + "line": 78, + "column": 17, + "stop_line": 78, + "stop_column": 25, "path": "src/paperless_mail/serialisers.py", "code": -2, - "name": "bad-override", - "description": "Class member `MailRuleSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `MailRuleSerializer.Meta` has type `type[MailRuleSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `MailRuleSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "bad-assignment", + "description": "`type[MailRule]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[MailRule]` is not assignable to attribute `model` with type `type[_MT]`", + "severity": "error" + }, + { + "line": 154, + "column": 17, + "stop_line": 154, + "stop_column": 30, + "path": "src/paperless_mail/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`type[ProcessedMail]` is not assignable to attribute `model` with type `type[_MT]`", + "concise_description": "`type[ProcessedMail]` is not assignable to attribute `model` with type `type[_MT]`", + "severity": "error" + }, + { + "line": 23, + "column": 11, + "stop_line": 23, + "stop_column": 18, + "path": "src/paperless_mail/tests/conftest.py", + "code": -2, + "name": "invalid-yield", + "description": "Yielded type `MailAccountFactory` is not assignable to declared yield type `MailAccount`", + "concise_description": "Yielded type `MailAccountFactory` is not assignable to declared yield type `MailAccount`", + "severity": "error" + }, + { + "line": 24, + "column": 5, + "stop_line": 24, + "stop_column": 19, + "path": "src/paperless_mail/tests/conftest.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `delete`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `delete`", + "severity": "error" + }, + { + "line": 124, + "column": 31, + "stop_line": 124, + "stop_column": 42, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 144, + "column": 31, + "stop_line": 144, + "stop_column": 42, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", "severity": "error" }, { "line": 153, - "column": 11, + "column": 56, "stop_line": 153, - "stop_column": 15, - "path": "src/paperless_mail/serialisers.py", + "stop_column": 67, + "path": "src/paperless_mail/tests/test_api.py", "code": -2, - "name": "bad-override", - "description": "Class member `ProcessedMailSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `ProcessedMailSerializer.Meta` has type `type[ProcessedMailSerializer.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", - "concise_description": "Class member `ProcessedMailSerializer.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", "severity": "error" }, { - "line": 57, + "line": 158, + "column": 31, + "stop_line": 158, + "stop_column": 42, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 167, + "column": 56, + "stop_line": 167, + "stop_column": 67, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 243, + "column": 27, + "stop_line": 243, + "stop_column": 37, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 290, + "column": 52, + "stop_line": 290, + "stop_column": 60, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "severity": "error" + }, + { + "line": 340, + "column": 53, + "stop_line": 340, + "stop_column": 64, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 342, + "column": 57, + "stop_line": 342, + "stop_column": 74, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `filter_from`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_from`", + "severity": "error" + }, + { + "line": 343, + "column": 55, + "stop_line": 343, + "stop_column": 70, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `filter_to`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_to`", + "severity": "error" + }, + { + "line": 344, + "column": 60, + "stop_line": 344, + "stop_column": 80, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `filter_subject`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_subject`", + "severity": "error" + }, + { + "line": 345, + "column": 57, + "stop_line": 345, + "stop_column": 74, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `filter_body`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_body`", + "severity": "error" + }, + { + "line": 348, + "column": 13, + "stop_line": 348, + "stop_column": 53, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `filter_attachment_filename_include`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_attachment_filename_include`", + "severity": "error" + }, + { + "line": 377, + "column": 24, + "stop_line": 377, + "stop_column": 35, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 391, + "column": 29, + "stop_line": 391, + "stop_column": 35, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `TagFactory` has no attribute `pk`", + "concise_description": "Object of class `TagFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 392, + "column": 37, + "stop_line": 392, + "stop_column": 53, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `CorrespondentFactory` has no attribute `pk`", + "concise_description": "Object of class `CorrespondentFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 393, + "column": 37, + "stop_line": 393, + "stop_column": 53, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentTypeFactory` has no attribute `pk`", + "concise_description": "Object of class `DocumentTypeFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 411, + "column": 53, + "stop_line": 411, + "stop_column": 64, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 462, + "column": 31, + "stop_line": 462, + "stop_column": 39, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 483, + "column": 31, + "stop_line": 483, + "stop_column": 39, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 492, + "column": 50, + "stop_line": 492, + "stop_column": 58, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 504, + "column": 28, + "stop_line": 504, + "stop_column": 46, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 524, + "column": 54, + "stop_line": 524, + "stop_column": 69, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "severity": "error" + }, + { + "line": 530, + "column": 28, + "stop_line": 530, + "stop_column": 46, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 552, + "column": 31, + "stop_line": 552, + "stop_column": 39, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 553, + "column": 30, + "stop_line": 553, + "stop_column": 48, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 557, + "column": 9, + "stop_line": 557, + "stop_column": 30, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `refresh_from_db`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `refresh_from_db`", + "severity": "error" + }, + { + "line": 576, + "column": 49, + "stop_line": 576, + "stop_column": 54, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `MailRuleFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "concise_description": "Argument `MailRuleFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "severity": "error" + }, + { + "line": 599, + "column": 24, + "stop_line": 599, + "stop_column": 34, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 651, + "column": 54, + "stop_line": 651, + "stop_column": 57, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "concise_description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "severity": "error" + }, + { + "line": 658, "column": 44, - "stop_line": 57, + "stop_line": 658, + "stop_column": 50, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 658, + "column": 52, + "stop_line": 658, + "stop_column": 58, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 658, + "column": 60, + "stop_line": 658, + "stop_column": 66, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 676, + "column": 60, + "stop_line": 676, + "stop_column": 68, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 680, + "column": 44, + "stop_line": 680, + "stop_column": 50, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 680, + "column": 52, + "stop_line": 680, + "stop_column": 58, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 702, + "column": 56, + "stop_line": 702, + "stop_column": 66, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "concise_description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "severity": "error" + }, + { + "line": 709, + "column": 30, + "stop_line": 709, + "stop_column": 43, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 709, + "column": 45, + "stop_line": 709, + "stop_column": 56, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 709, + "column": 58, + "stop_line": 709, + "stop_column": 71, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 717, + "column": 14, + "stop_line": 717, + "stop_column": 27, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 717, + "column": 29, + "stop_line": 717, + "stop_column": 40, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 717, + "column": 42, + "stop_line": 717, + "stop_column": 55, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 719, + "column": 58, + "stop_line": 719, + "stop_column": 71, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 720, + "column": 58, + "stop_line": 720, + "stop_column": 69, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 721, + "column": 58, + "stop_line": 721, + "stop_column": 71, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 722, + "column": 57, + "stop_line": 722, + "stop_column": 72, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 728, + "column": 30, + "stop_line": 728, + "stop_column": 45, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 733, + "column": 57, + "stop_line": 733, + "stop_column": 72, + "path": "src/paperless_mail/tests/test_api.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", + "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 60, + "column": 44, + "stop_line": 60, "stop_column": 48, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15505,9 +13969,9 @@ "severity": "error" }, { - "line": 76, + "line": 79, "column": 37, - "stop_line": 76, + "stop_line": 79, "stop_column": 42, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15517,9 +13981,9 @@ "severity": "error" }, { - "line": 119, + "line": 122, "column": 37, - "stop_line": 119, + "stop_line": 122, "stop_column": 42, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15529,9 +13993,9 @@ "severity": "error" }, { - "line": 124, + "line": 127, "column": 37, - "stop_line": 124, + "stop_line": 127, "stop_column": 42, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15541,9 +14005,9 @@ "severity": "error" }, { - "line": 128, + "line": 131, "column": 37, - "stop_line": 128, + "stop_line": 131, "stop_column": 42, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15553,9 +14017,9 @@ "severity": "error" }, { - "line": 174, + "line": 177, "column": 25, - "stop_line": 174, + "stop_line": 177, "stop_column": 40, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15565,9 +14029,9 @@ "severity": "error" }, { - "line": 176, + "line": 179, "column": 25, - "stop_line": 176, + "stop_line": 179, "stop_column": 37, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15577,9 +14041,9 @@ "severity": "error" }, { - "line": 262, + "line": 265, "column": 9, - "stop_line": 262, + "stop_line": 265, "stop_column": 22, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15589,9 +14053,9 @@ "severity": "error" }, { - "line": 263, + "line": 266, "column": 9, - "stop_line": 263, + "stop_line": 266, "stop_column": 25, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15601,34 +14065,10 @@ "severity": "error" }, { - "line": 421, - "column": 30, - "stop_line": 421, - "stop_column": 43, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "invalid-argument", - "description": "Expected string literal \"message\"", - "concise_description": "Expected string literal \"message\"", - "severity": "error" - }, - { - "line": 428, - "column": 31, - "stop_line": 428, - "stop_column": 44, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "invalid-argument", - "description": "Expected string literal \"message2\"", - "concise_description": "Expected string literal \"message2\"", - "severity": "error" - }, - { - "line": 435, - "column": 58, - "stop_line": 435, - "stop_column": 72, + "line": 439, + "column": 50, + "stop_line": 439, + "stop_column": 64, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, "name": "missing-attribute", @@ -15637,9 +14077,9 @@ "severity": "error" }, { - "line": 444, + "line": 448, "column": 54, - "stop_line": 444, + "stop_line": 448, "stop_column": 61, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15649,9 +14089,9 @@ "severity": "error" }, { - "line": 450, + "line": 454, "column": 40, - "stop_line": 450, + "stop_line": 454, "stop_column": 47, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15661,9 +14101,9 @@ "severity": "error" }, { - "line": 455, + "line": 459, "column": 40, - "stop_line": 455, + "stop_line": 459, "stop_column": 48, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15673,9 +14113,21 @@ "severity": "error" }, { - "line": 464, + "line": 462, + "column": 32, + "stop_line": 462, + "stop_column": 47, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `CorrespondentFactory` has no attribute `id`", + "concise_description": "Object of class `CorrespondentFactory` has no attribute `id`", + "severity": "error" + }, + { + "line": 468, "column": 40, - "stop_line": 464, + "stop_line": 468, "stop_column": 47, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15685,9 +14137,9 @@ "severity": "error" }, { - "line": 467, + "line": 471, "column": 40, - "stop_line": 467, + "stop_line": 471, "stop_column": 48, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15697,45 +14149,33 @@ "severity": "error" }, { - "line": 476, - "column": 40, - "stop_line": 476, + "line": 473, + "column": 32, + "stop_line": 473, "stop_column": 47, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", - "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "name": "missing-attribute", + "description": "Object of class `CorrespondentFactory` has no attribute `id`", + "concise_description": "Object of class `CorrespondentFactory` has no attribute `id`", "severity": "error" }, { "line": 480, - "column": 30, + "column": 40, "stop_line": 480, - "stop_column": 43, + "stop_column": 47, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, - "name": "invalid-argument", - "description": "Expected string literal \"message\"", - "concise_description": "Expected string literal \"message\"", + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", "severity": "error" }, { - "line": 482, - "column": 26, - "stop_line": 482, - "stop_column": 38, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "invalid-argument", - "description": "Expected string literal \"att\"", - "concise_description": "Expected string literal \"att\"", - "severity": "error" - }, - { - "line": 491, + "line": 495, "column": 45, - "stop_line": 491, + "stop_line": 495, "stop_column": 52, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15745,9 +14185,9 @@ "severity": "error" }, { - "line": 491, + "line": 495, "column": 54, - "stop_line": 491, + "stop_line": 495, "stop_column": 57, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15757,9 +14197,9 @@ "severity": "error" }, { - "line": 496, + "line": 500, "column": 45, - "stop_line": 496, + "stop_line": 500, "stop_column": 52, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15769,9 +14209,9 @@ "severity": "error" }, { - "line": 496, + "line": 500, "column": 54, - "stop_line": 496, + "stop_line": 500, "stop_column": 57, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15781,9 +14221,9 @@ "severity": "error" }, { - "line": 501, + "line": 505, "column": 45, - "stop_line": 501, + "stop_line": 505, "stop_column": 52, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15793,9 +14233,9 @@ "severity": "error" }, { - "line": 501, + "line": 505, "column": 54, - "stop_line": 501, + "stop_line": 505, "stop_column": 57, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15805,21 +14245,9 @@ "severity": "error" }, { - "line": 533, - "column": 30, - "stop_line": 533, - "stop_column": 43, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "invalid-argument", - "description": "Expected string literal \"message\"", - "concise_description": "Expected string literal \"message\"", - "severity": "error" - }, - { - "line": 1246, + "line": 1250, "column": 9, - "stop_line": 1246, + "stop_line": 1250, "stop_column": 50, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15829,9 +14257,9 @@ "severity": "error" }, { - "line": 1252, + "line": 1256, "column": 9, - "stop_line": 1252, + "stop_line": 1256, "stop_column": 50, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15841,9 +14269,9 @@ "severity": "error" }, { - "line": 1279, + "line": 1283, "column": 9, - "stop_line": 1279, + "stop_line": 1283, "stop_column": 50, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15853,9 +14281,9 @@ "severity": "error" }, { - "line": 1285, + "line": 1289, "column": 9, - "stop_line": 1285, + "stop_line": 1289, "stop_column": 50, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15865,9 +14293,9 @@ "severity": "error" }, { - "line": 1347, + "line": 1351, "column": 13, - "stop_line": 1351, + "stop_line": 1355, "stop_column": 14, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15877,9 +14305,9 @@ "severity": "error" }, { - "line": 1366, + "line": 1370, "column": 13, - "stop_line": 1370, + "stop_line": 1374, "stop_column": 14, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, @@ -15889,33 +14317,81 @@ "severity": "error" }, { - "line": 1661, + "line": 1603, + "column": 21, + "stop_line": 1603, + "stop_column": 33, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 1614, + "column": 13, + "stop_line": 1614, + "stop_column": 39, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `action_parameter`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `action_parameter`", + "severity": "error" + }, + { + "line": 1641, + "column": 25, + "stop_line": 1641, + "stop_column": 37, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 1652, "column": 41, - "stop_line": 1661, + "stop_line": 1652, "stop_column": 61, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", "severity": "error" }, { - "line": 2070, - "column": 26, - "stop_line": 2070, - "stop_column": 35, + "line": 2045, + "column": 24, + "stop_line": 2045, + "stop_column": 39, "path": "src/paperless_mail/tests/test_mail.py", "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `name`", - "concise_description": "Object of class `NoneType` has no attribute `name`", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", "severity": "error" }, { - "line": 134, + "line": 2068, + "column": 24, + "stop_line": 2068, + "stop_column": 39, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "severity": "error" + }, + { + "line": 135, "column": 42, - "stop_line": 134, + "stop_line": 135, "stop_column": 54, "path": "src/paperless_mail/tests/test_mail_oauth.py", "code": -2, @@ -15925,9 +14401,9 @@ "severity": "error" }, { - "line": 145, + "line": 146, "column": 42, - "stop_line": 145, + "stop_line": 146, "stop_column": 54, "path": "src/paperless_mail/tests/test_mail_oauth.py", "code": -2, @@ -15937,9 +14413,9 @@ "severity": "error" }, { - "line": 177, + "line": 178, "column": 46, - "stop_line": 177, + "stop_line": 178, "stop_column": 58, "path": "src/paperless_mail/tests/test_mail_oauth.py", "code": -2, @@ -15949,9 +14425,9 @@ "severity": "error" }, { - "line": 187, + "line": 188, "column": 46, - "stop_line": 187, + "stop_line": 188, "stop_column": 58, "path": "src/paperless_mail/tests/test_mail_oauth.py", "code": -2, @@ -15960,6 +14436,42 @@ "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", "severity": "error" }, + { + "line": 308, + "column": 55, + "stop_line": 308, + "stop_column": 67, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", + "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", + "severity": "error" + }, + { + "line": 326, + "column": 55, + "stop_line": 326, + "stop_column": 75, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", + "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", + "severity": "error" + }, + { + "line": 366, + "column": 63, + "stop_line": 366, + "stop_column": 75, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", + "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", + "severity": "error" + }, { "line": 70, "column": 9, @@ -16009,9 +14521,9 @@ "severity": "error" }, { - "line": 268, + "line": 298, "column": 28, - "stop_line": 268, + "stop_line": 298, "stop_column": 34, "path": "src/paperless_mail/views.py", "code": -2, @@ -16021,9 +14533,9 @@ "severity": "error" }, { - "line": 274, + "line": 304, "column": 29, - "stop_line": 274, + "stop_line": 304, "stop_column": 40, "path": "src/paperless_mail/views.py", "code": -2, @@ -16033,9 +14545,9 @@ "severity": "error" }, { - "line": 278, + "line": 308, "column": 26, - "stop_line": 278, + "stop_line": 308, "stop_column": 34, "path": "src/paperless_mail/views.py", "code": -2, diff --git a/pyproject.toml b/pyproject.toml index 19dfe3fdc..31e8a4421 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -178,6 +178,8 @@ respect-gitignore = true fix = true show-fixes = true output-format = "grouped" +[tool.ruff.format] +line-ending = "lf" [tool.ruff.lint] # https://docs.astral.sh/ruff/rules/ extend-select = [ diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index e3037eeae..d5c1c0353 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -214,7 +214,7 @@ class SetPermissionsMixin: set_permissions_for_object(permissions, object) -class SerializerWithPerms(serializers.Serializer): +class SerializerWithPerms(serializers.Serializer[dict[str, Any]]): def __init__(self, *args, **kwargs) -> None: self.user = kwargs.pop("user", None) self.full_perms = kwargs.pop("full_perms", False) @@ -480,7 +480,7 @@ class OwnedObjectListSerializer(serializers.ListSerializer[Any]): class CorrespondentSerializer(MatchingModelSerializer, OwnedObjectSerializer): last_correspondence = serializers.DateField(read_only=True, required=False) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = Correspondent fields = ( "id", @@ -499,7 +499,7 @@ class CorrespondentSerializer(MatchingModelSerializer, OwnedObjectSerializer): class DocumentTypeSerializer(MatchingModelSerializer, OwnedObjectSerializer): - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = DocumentType fields = ( "id", @@ -624,7 +624,7 @@ class TagSerializer(MatchingModelSerializer, OwnedObjectSerializer): # children as nested Tag objects children = serializers.SerializerMethodField() - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = Tag fields = ( "id", @@ -710,7 +710,7 @@ class CustomFieldSerializer(serializers.ModelSerializer[CustomField]): document_count = serializers.IntegerField(read_only=True) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = CustomField fields = [ "id", @@ -916,7 +916,7 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer[CustomFieldInsta return data - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = CustomFieldInstance fields = [ "value", @@ -926,7 +926,7 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer[CustomFieldInsta class BasicUserSerializer(serializers.ModelSerializer[User]): # Different than paperless.serializers.UserSerializer - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = User fields = ["id", "username", "first_name", "last_name"] @@ -934,7 +934,7 @@ class BasicUserSerializer(serializers.ModelSerializer[User]): class NotesSerializer(serializers.ModelSerializer[Note]): user = BasicUserSerializer(read_only=True) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = Note fields = ["id", "note", "created", "user"] ordering = ["-created"] @@ -961,20 +961,12 @@ def _get_viewable_duplicates( return duplicates.filter(id__in=allowed) -class DuplicateDocumentSummarySerializer(serializers.Serializer): +class DuplicateDocumentSummarySerializer(serializers.Serializer[dict[str, Any]]): id = serializers.IntegerField() title = serializers.CharField() deleted_at = serializers.DateTimeField(allow_null=True) -class DocumentVersionInfoSerializer(serializers.Serializer): - id = serializers.IntegerField() - added = serializers.DateTimeField() - version_label = serializers.CharField(required=False, allow_null=True) - checksum = serializers.CharField(required=False, allow_null=True) - is_root = serializers.BooleanField() - - class _DocumentVersionInfo(TypedDict): id: int added: datetime @@ -983,6 +975,14 @@ class _DocumentVersionInfo(TypedDict): is_root: bool +class DocumentVersionInfoSerializer(serializers.Serializer[_DocumentVersionInfo]): + id = serializers.IntegerField() + added = serializers.DateTimeField() + version_label = serializers.CharField(required=False, allow_null=True) + checksum = serializers.CharField(required=False, allow_null=True) + is_root = serializers.BooleanField() + + @extend_schema_serializer( deprecate_fields=["created_date"], ) @@ -1223,7 +1223,7 @@ class DocumentSerializer( super().__init__(*args, **kwargs) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = Document fields = ( "id", @@ -1316,7 +1316,7 @@ class SearchResultSerializer(DocumentSerializer): class SavedViewFilterRuleSerializer(serializers.ModelSerializer[SavedViewFilterRule]): - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = SavedViewFilterRule fields = ["rule_type", "value"] @@ -1324,7 +1324,7 @@ class SavedViewFilterRuleSerializer(serializers.ModelSerializer[SavedViewFilterR class SavedViewSerializer(OwnedObjectSerializer): filter_rules = SavedViewFilterRuleSerializer(many=True) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = SavedView fields = [ "id", @@ -1532,7 +1532,7 @@ class SavedViewSerializer(OwnedObjectSerializer): return saved_view -class DocumentListSerializer(serializers.Serializer): +class DocumentListSerializer(serializers.Serializer[dict[str, list[int]]]): documents = serializers.ListField( required=True, label="Documents", @@ -2085,7 +2085,7 @@ class BulkEditSerializer( return attrs -class PostDocumentSerializer(serializers.Serializer): +class PostDocumentSerializer(serializers.Serializer[dict[str, Any]]): created = serializers.DateTimeField( label="Created", allow_null=True, @@ -2262,7 +2262,7 @@ class PostDocumentSerializer(serializers.Serializer): return created.date() -class DocumentVersionSerializer(serializers.Serializer): +class DocumentVersionSerializer(serializers.Serializer[dict[str, Any]]): document = serializers.FileField( label="Document", write_only=True, @@ -2278,7 +2278,7 @@ class DocumentVersionSerializer(serializers.Serializer): validate_document = PostDocumentSerializer().validate_document -class DocumentVersionLabelSerializer(serializers.Serializer): +class DocumentVersionLabelSerializer(serializers.Serializer[dict[str, str | None]]): version_label = serializers.CharField( label="Version label", required=True, @@ -2366,7 +2366,7 @@ class EmailSerializer(DocumentListSerializer): class StoragePathSerializer(MatchingModelSerializer, OwnedObjectSerializer): - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = StoragePath fields = ( "id", @@ -2414,7 +2414,7 @@ class StoragePathSerializer(MatchingModelSerializer, OwnedObjectSerializer): class UiSettingsViewSerializer(serializers.ModelSerializer[UiSettings]): settings = serializers.DictField(required=False, allow_null=True) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = UiSettings depth = 1 fields = [ @@ -2459,7 +2459,7 @@ class TaskSerializerV10(OwnedObjectSerializer): read_only=True, ) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = PaperlessTask fields = ( "id", @@ -2484,7 +2484,7 @@ class TaskSerializerV10(OwnedObjectSerializer): read_only_fields = fields -class TaskSerializerV9(serializers.ModelSerializer): +class TaskSerializerV9(serializers.ModelSerializer[PaperlessTask]): """Task serializer for API v9 backwards compatibility. Maps old field names to the new model fields so existing clients continue @@ -2512,7 +2512,7 @@ class TaskSerializerV9(serializers.ModelSerializer): # v9 field: duplicate_documents -> list of duplicate IDs from result_data duplicate_documents = serializers.SerializerMethodField() - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = PaperlessTask fields = ( "id", @@ -2609,7 +2609,7 @@ class TaskSerializerV9(serializers.ModelSerializer): return list(qs.values("id", "title", "deleted_at")) -class TaskSummarySerializer(serializers.Serializer): +class TaskSummarySerializer(serializers.Serializer[dict[str, Any]]): task_type = serializers.CharField() total_count = serializers.IntegerField() pending_count = serializers.IntegerField() @@ -2622,7 +2622,7 @@ class TaskSummarySerializer(serializers.Serializer): last_failure = serializers.DateTimeField(allow_null=True) -class RunTaskSerializer(serializers.Serializer): +class RunTaskSerializer(serializers.Serializer[dict[str, str]]): task_type = serializers.ChoiceField( choices=PaperlessTask.TaskType.choices, label="Task Type", @@ -2655,7 +2655,7 @@ class AcknowledgeTasksViewSerializer(serializers.Serializer[dict[str, Any]]): class ShareLinkSerializer(OwnedObjectSerializer): - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = ShareLink fields = ( "id", @@ -2700,7 +2700,7 @@ class ShareLinkBundleSerializer(OwnedObjectSerializer): ) document_count = SerializerMethodField() - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = ShareLinkBundle fields = ( "id", @@ -2913,7 +2913,7 @@ class WorkflowTriggerSerializer(serializers.ModelSerializer[WorkflowTrigger]): label="Trigger Type", ) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = WorkflowTrigger fields = [ "id", @@ -3009,7 +3009,7 @@ class WorkflowTriggerSerializer(serializers.ModelSerializer[WorkflowTrigger]): class WorkflowActionEmailSerializer(serializers.ModelSerializer[WorkflowActionEmail]): id = serializers.IntegerField(allow_null=True, required=False) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = WorkflowActionEmail fields = [ "id", @@ -3029,7 +3029,7 @@ class WorkflowActionWebhookSerializer( url_validator(url) return url - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = WorkflowActionWebhook fields = [ "id", @@ -3052,7 +3052,7 @@ class WorkflowActionSerializer(serializers.ModelSerializer[WorkflowAction]): email = WorkflowActionEmailSerializer(allow_null=True, required=False) webhook = WorkflowActionWebhookSerializer(allow_null=True, required=False) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = WorkflowAction fields = [ "id", @@ -3171,7 +3171,7 @@ class WorkflowSerializer(serializers.ModelSerializer[Workflow]): triggers = WorkflowTriggerSerializer(many=True) actions = WorkflowActionSerializer(many=True) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = Workflow fields = [ "id", diff --git a/src/documents/tests/factories.py b/src/documents/tests/factories.py index aaadd6d14..1458d7435 100644 --- a/src/documents/tests/factories.py +++ b/src/documents/tests/factories.py @@ -16,8 +16,8 @@ from documents.models import StoragePath from documents.models import Tag -class CorrespondentFactory(DjangoModelFactory): - class Meta: +class CorrespondentFactory(DjangoModelFactory[Correspondent]): + class Meta(DjangoModelFactory.Meta): model = Correspondent name = factory.Sequence(lambda n: f"{factory.Faker('company')} {n}") @@ -25,8 +25,8 @@ class CorrespondentFactory(DjangoModelFactory): matching_algorithm = MatchingModel.MATCH_NONE -class DocumentTypeFactory(DjangoModelFactory): - class Meta: +class DocumentTypeFactory(DjangoModelFactory[DocumentType]): + class Meta(DjangoModelFactory.Meta): model = DocumentType name = factory.Sequence(lambda n: f"{factory.Faker('bs')} {n}") @@ -34,8 +34,8 @@ class DocumentTypeFactory(DjangoModelFactory): matching_algorithm = MatchingModel.MATCH_NONE -class TagFactory(DjangoModelFactory): - class Meta: +class TagFactory(DjangoModelFactory[Tag]): + class Meta(DjangoModelFactory.Meta): model = Tag name = factory.Sequence(lambda n: f"{factory.Faker('word')} {n}") @@ -44,8 +44,8 @@ class TagFactory(DjangoModelFactory): is_inbox_tag = False -class StoragePathFactory(DjangoModelFactory): - class Meta: +class StoragePathFactory(DjangoModelFactory[StoragePath]): + class Meta(DjangoModelFactory.Meta): model = StoragePath name = factory.Sequence( @@ -56,8 +56,8 @@ class StoragePathFactory(DjangoModelFactory): matching_algorithm = MatchingModel.MATCH_NONE -class DocumentFactory(DjangoModelFactory): - class Meta: +class DocumentFactory(DjangoModelFactory[Document]): + class Meta(DjangoModelFactory.Meta): model = Document title = factory.Faker("sentence", nb_words=4) @@ -68,8 +68,8 @@ class DocumentFactory(DjangoModelFactory): storage_path = None -class PaperlessTaskFactory(DjangoModelFactory): - class Meta: +class PaperlessTaskFactory(DjangoModelFactory[PaperlessTask]): + class Meta(DjangoModelFactory.Meta): model = PaperlessTask task_id = factory.Faker("uuid4") diff --git a/src/documents/tests/management/test_management_base_cmd.py b/src/documents/tests/management/test_management_base_cmd.py index 5ce59aa85..572bcd52d 100644 --- a/src/documents/tests/management/test_management_base_cmd.py +++ b/src/documents/tests/management/test_management_base_cmd.py @@ -148,7 +148,7 @@ def mock_queryset(): class TestProcessResult: """Tests for the ProcessResult dataclass.""" - def test_success_result(self): + def test_success_result(self) -> None: result = ProcessResult(item=1, result=2, error=None) assert result.item == 1 @@ -156,7 +156,7 @@ class TestProcessResult: assert result.error is None assert result.success is True - def test_error_result(self): + def test_error_result(self) -> None: error = ValueError("test error") result = ProcessResult(item=1, result=None, error=error) @@ -170,7 +170,7 @@ class TestProcessResult: class TestPaperlessCommandArguments: """Tests for argument parsing behavior.""" - def test_progress_bar_argument_added_by_default(self): + def test_progress_bar_argument_added_by_default(self) -> None: command = SimpleCommand() parser = command.create_parser("manage.py", "simple") @@ -180,14 +180,14 @@ class TestPaperlessCommandArguments: options = parser.parse_args([]) assert options.no_progress_bar is False - def test_progress_bar_argument_not_added_when_disabled(self): + def test_progress_bar_argument_not_added_when_disabled(self) -> None: command = NoProgressBarCommand() parser = command.create_parser("manage.py", "noprogress") options = parser.parse_args([]) assert not hasattr(options, "no_progress_bar") - def test_processes_argument_added_when_multiprocessing_enabled(self): + def test_processes_argument_added_when_multiprocessing_enabled(self) -> None: command = MultiprocessCommand() parser = command.create_parser("manage.py", "multiprocess") @@ -197,7 +197,7 @@ class TestPaperlessCommandArguments: options = parser.parse_args([]) assert options.processes >= 1 - def test_processes_argument_not_added_when_multiprocessing_disabled(self): + def test_processes_argument_not_added_when_multiprocessing_disabled(self) -> None: command = SimpleCommand() parser = command.create_parser("manage.py", "simple") @@ -232,7 +232,7 @@ class TestPaperlessCommandExecute: *, no_progress_bar_flag: bool, expected: bool, - ): + ) -> None: command = SimpleCommand() command.stdout = io.StringIO() command.stderr = io.StringIO() @@ -242,7 +242,10 @@ class TestPaperlessCommandExecute: assert command.no_progress_bar is expected - def test_no_progress_bar_always_true_when_not_supported(self, base_options: dict): + def test_no_progress_bar_always_true_when_not_supported( + self, + base_options: dict, + ) -> None: command = NoProgressBarCommand() command.stdout = io.StringIO() command.stderr = io.StringIO() @@ -263,7 +266,7 @@ class TestPaperlessCommandExecute: base_options: dict, processes: int, expected: int, - ): + ) -> None: command = MultiprocessCommand() command.stdout = io.StringIO() command.stderr = io.StringIO() @@ -284,7 +287,7 @@ class TestPaperlessCommandExecute: self, base_options: dict, invalid_count: int, - ): + ) -> None: command = MultiprocessCommand() command.stdout = io.StringIO() command.stderr = io.StringIO() @@ -294,7 +297,10 @@ class TestPaperlessCommandExecute: with pytest.raises(CommandError, match="--processes must be at least 1"): command.execute(**options) - def test_process_count_defaults_to_one_when_not_supported(self, base_options: dict): + def test_process_count_defaults_to_one_when_not_supported( + self, + base_options: dict, + ) -> None: command = SimpleCommand() command.stdout = io.StringIO() command.stderr = io.StringIO() @@ -313,7 +319,7 @@ class TestGetIterableLength: self, simple_command: SimpleCommand, mock_queryset, - ): + ) -> None: """Should call .count() on Django querysets rather than len().""" queryset = mock_queryset([1, 2, 3, 4, 5]) @@ -322,13 +328,16 @@ class TestGetIterableLength: assert result == 5 assert queryset.count_called is True - def test_uses_len_for_sized(self, simple_command: SimpleCommand): + def test_uses_len_for_sized(self, simple_command: SimpleCommand) -> None: """Should use len() for sequences and other Sized types.""" result = simple_command._get_iterable_length([1, 2, 3, 4]) assert result == 4 - def test_returns_none_for_unsized_iterables(self, simple_command: SimpleCommand): + def test_returns_none_for_unsized_iterables( + self, + simple_command: SimpleCommand, + ) -> None: """Should return None for generators and other iterables without len().""" result = simple_command._get_iterable_length(x for x in [1, 2, 3]) @@ -339,7 +348,7 @@ class TestGetIterableLength: class TestTrack: """Tests for the track() method.""" - def test_with_progress_bar_disabled(self, simple_command: SimpleCommand): + def test_with_progress_bar_disabled(self, simple_command: SimpleCommand) -> None: simple_command.no_progress_bar = True items = ["a", "b", "c"] @@ -347,7 +356,7 @@ class TestTrack: assert result == items - def test_with_progress_bar_enabled(self, simple_command: SimpleCommand): + def test_with_progress_bar_enabled(self, simple_command: SimpleCommand) -> None: simple_command.no_progress_bar = False items = [1, 2, 3] @@ -355,7 +364,7 @@ class TestTrack: assert result == items - def test_with_explicit_total(self, simple_command: SimpleCommand): + def test_with_explicit_total(self, simple_command: SimpleCommand) -> None: simple_command.no_progress_bar = False def gen(): @@ -365,7 +374,7 @@ class TestTrack: assert result == [1, 2, 3] - def test_with_generator_no_total(self, simple_command: SimpleCommand): + def test_with_generator_no_total(self, simple_command: SimpleCommand) -> None: def gen(): yield from [1, 2, 3] @@ -373,7 +382,7 @@ class TestTrack: assert result == [1, 2, 3] - def test_empty_iterable(self, simple_command: SimpleCommand): + def test_empty_iterable(self, simple_command: SimpleCommand) -> None: result = list(simple_command.track([])) assert result == [] @@ -383,7 +392,7 @@ class TestTrack: simple_command: SimpleCommand, mock_queryset, mocker: MockerFixture, - ): + ) -> None: """Verify track() uses .count() for querysets.""" simple_command.no_progress_bar = False queryset = mock_queryset([1, 2, 3]) @@ -404,7 +413,7 @@ class TestProcessParallel: def test_sequential_processing_single_process( self, multiprocess_command: MultiprocessCommand, - ): + ) -> None: multiprocess_command.process_count = 1 items = [1, 2, 3, 4, 5] @@ -419,7 +428,7 @@ class TestProcessParallel: def test_sequential_processing_handles_errors( self, multiprocess_command: MultiprocessCommand, - ): + ) -> None: multiprocess_command.process_count = 1 items = [1, 2, 0, 4] # 0 causes ZeroDivisionError @@ -439,7 +448,7 @@ class TestProcessParallel: self, multiprocess_command: MultiprocessCommand, mocker: MockerFixture, - ): + ) -> None: multiprocess_command.process_count = 2 items = [1, 2, 3] @@ -456,7 +465,7 @@ class TestProcessParallel: self, multiprocess_command: MultiprocessCommand, mocker: MockerFixture, - ): + ) -> None: multiprocess_command.process_count = 2 items = [1, 2, 0, 4] @@ -468,7 +477,7 @@ class TestProcessParallel: assert len(failures) == 1 assert failures[0].item == 0 - def test_empty_items(self, multiprocess_command: MultiprocessCommand): + def test_empty_items(self, multiprocess_command: MultiprocessCommand) -> None: results = list(multiprocess_command.process_parallel(_double_value, [])) assert results == [] @@ -476,7 +485,7 @@ class TestProcessParallel: def test_result_contains_original_item( self, multiprocess_command: MultiprocessCommand, - ): + ) -> None: items = [10, 20, 30] results = list(multiprocess_command.process_parallel(_double_value, items)) @@ -489,7 +498,7 @@ class TestProcessParallel: self, multiprocess_command: MultiprocessCommand, mocker: MockerFixture, - ): + ) -> None: """Verify single process uses sequential path (important for testing).""" multiprocess_command.process_count = 1 @@ -505,7 +514,7 @@ class TestProcessParallel: self, multiprocess_command: MultiprocessCommand, mocker: MockerFixture, - ): + ) -> None: """Verify multiple processes uses parallel path.""" multiprocess_command.process_count = 2 diff --git a/src/documents/tests/search/test_backend.py b/src/documents/tests/search/test_backend.py index 99da1b674..5c63e0cee 100644 --- a/src/documents/tests/search/test_backend.py +++ b/src/documents/tests/search/test_backend.py @@ -16,7 +16,7 @@ pytestmark = [pytest.mark.search, pytest.mark.django_db] class TestWriteBatch: """Test WriteBatch context manager functionality.""" - def test_rolls_back_on_exception(self, backend: TantivyBackend): + def test_rolls_back_on_exception(self, backend: TantivyBackend) -> None: """Batch operations must rollback on exception to preserve index integrity.""" doc = Document.objects.create( title="Rollback Target", @@ -43,7 +43,7 @@ class TestSearch: def test_text_mode_limits_default_search_to_title_and_content( self, backend: TantivyBackend, - ): + ) -> None: """Simple text mode must not match metadata-only fields.""" doc = Document.objects.create( title="Invoice document", @@ -71,7 +71,7 @@ class TestSearch: def test_title_mode_limits_default_search_to_title_only( self, backend: TantivyBackend, - ): + ) -> None: """Title mode must not match content-only terms.""" doc = Document.objects.create( title="Invoice document", @@ -93,7 +93,7 @@ class TestSearch: def test_text_mode_matches_partial_term_substrings( self, backend: TantivyBackend, - ): + ) -> None: """Simple text mode should support substring matching within tokens.""" doc = Document.objects.create( title="Account access", @@ -117,7 +117,7 @@ class TestSearch: def test_text_mode_does_not_match_on_partial_term_overlap( self, backend: TantivyBackend, - ): + ) -> None: """Simple text mode should not match documents that merely share partial fragments.""" doc = Document.objects.create( title="Adobe Acrobat PDF Files", @@ -135,7 +135,7 @@ class TestSearch: def test_text_mode_anchors_later_query_tokens_to_token_starts( self, backend: TantivyBackend, - ): + ) -> None: """Multi-token simple search should not match later tokens in the middle of a word.""" exact_doc = Document.objects.create( title="Z-Berichte 6", @@ -170,7 +170,7 @@ class TestSearch: def test_text_mode_ignores_queries_without_searchable_tokens( self, backend: TantivyBackend, - ): + ) -> None: """Simple text mode should safely return no hits for symbol-only strings.""" doc = Document.objects.create( title="Guide", @@ -187,7 +187,7 @@ class TestSearch: def test_title_mode_matches_partial_term_substrings( self, backend: TantivyBackend, - ): + ) -> None: """Title mode should support substring matching within title tokens.""" doc = Document.objects.create( title="Password guide", @@ -210,7 +210,7 @@ class TestSearch: == 1 ) - def test_sort_field_ascending(self, backend: TantivyBackend): + def test_sort_field_ascending(self, backend: TantivyBackend) -> None: """Searching with sort_reverse=False must return results in ascending ASN order.""" for asn in [30, 10, 20]: doc = Document.objects.create( @@ -231,7 +231,7 @@ class TestSearch: asns = [Document.objects.get(pk=doc_id).archive_serial_number for doc_id in ids] assert asns == [10, 20, 30] - def test_sort_field_descending(self, backend: TantivyBackend): + def test_sort_field_descending(self, backend: TantivyBackend) -> None: """Searching with sort_reverse=True must return results in descending ASN order.""" for asn in [30, 10, 20]: doc = Document.objects.create( @@ -256,7 +256,7 @@ class TestSearch: class TestSearchIds: """Test lightweight ID-only search.""" - def test_returns_matching_ids(self, backend: TantivyBackend): + def test_returns_matching_ids(self, backend: TantivyBackend) -> None: """search_ids must return IDs of all matching documents.""" docs = [] for i in range(5): @@ -282,7 +282,7 @@ class TestSearchIds: assert set(ids) == {d.pk for d in docs} assert other.pk not in ids - def test_respects_permission_filter(self, backend: TantivyBackend): + def test_respects_permission_filter(self, backend: TantivyBackend) -> None: """search_ids must respect user permission filtering.""" owner = User.objects.create_user("ids_owner") other = User.objects.create_user("ids_other") @@ -303,7 +303,7 @@ class TestSearchIds: backend.search_ids("secret", user=other, search_mode=SearchMode.QUERY) == [] ) - def test_respects_fuzzy_threshold(self, backend: TantivyBackend, settings): + def test_respects_fuzzy_threshold(self, backend: TantivyBackend, settings) -> None: """search_ids must apply the same fuzzy threshold as search().""" doc = Document.objects.create( title="threshold test", @@ -316,7 +316,7 @@ class TestSearchIds: ids = backend.search_ids("unique", user=None, search_mode=SearchMode.QUERY) assert ids == [] - def test_returns_ids_for_text_mode(self, backend: TantivyBackend): + def test_returns_ids_for_text_mode(self, backend: TantivyBackend) -> None: """search_ids must work with TEXT search mode.""" doc = Document.objects.create( title="text mode doc", @@ -332,7 +332,7 @@ class TestSearchIds: class TestRebuild: """Test index rebuilding functionality.""" - def test_with_iter_wrapper_called(self, backend: TantivyBackend): + def test_with_iter_wrapper_called(self, backend: TantivyBackend) -> None: """Index rebuild must pass documents through iter_wrapper for progress tracking.""" seen = [] @@ -349,7 +349,7 @@ class TestRebuild: class TestAutocomplete: """Test autocomplete functionality.""" - def test_basic_functionality(self, backend: TantivyBackend): + def test_basic_functionality(self, backend: TantivyBackend) -> None: """Autocomplete must return words matching the given prefix.""" doc = Document.objects.create( title="Invoice from Microsoft Corporation", @@ -362,7 +362,10 @@ class TestAutocomplete: results = backend.autocomplete("micro", limit=10) assert "microsoft" in results - def test_results_ordered_by_document_frequency(self, backend: TantivyBackend): + def test_results_ordered_by_document_frequency( + self, + backend: TantivyBackend, + ) -> None: """Autocomplete results must be ordered by document frequency to prioritize common terms.""" # "payment" appears in 3 docs; "payslip" in 1 — "pay" prefix should # return "payment" before "payslip". @@ -390,7 +393,10 @@ class TestAutocomplete: class TestMoreLikeThis: """Test more like this functionality.""" - def test_more_like_this_ids_excludes_original(self, backend: TantivyBackend): + def test_more_like_this_ids_excludes_original( + self, + backend: TantivyBackend, + ) -> None: """more_like_this_ids must return IDs of similar documents, excluding the original.""" doc1 = Document.objects.create( title="Important document", @@ -421,11 +427,11 @@ class TestSingleton: yield reset_backend() - def test_returns_same_instance_on_repeated_calls(self, index_dir): + def test_returns_same_instance_on_repeated_calls(self, index_dir) -> None: """Singleton pattern: repeated calls to get_backend() must return the same instance.""" assert get_backend() is get_backend() - def test_reinitializes_when_index_dir_changes(self, tmp_path, settings): + def test_reinitializes_when_index_dir_changes(self, tmp_path, settings) -> None: """Backend singleton must reinitialize when INDEX_DIR setting changes for test isolation.""" settings.INDEX_DIR = tmp_path / "a" (tmp_path / "a").mkdir() @@ -438,7 +444,7 @@ class TestSingleton: assert b1 is not b2 assert b2._path == tmp_path / "b" - def test_reset_forces_new_instance(self, index_dir): + def test_reset_forces_new_instance(self, index_dir) -> None: """reset_backend() must force creation of a new backend instance on next get_backend() call.""" b1 = get_backend() reset_backend() @@ -449,7 +455,7 @@ class TestSingleton: class TestFieldHandling: """Test handling of various document fields.""" - def test_none_values_handled_correctly(self, backend: TantivyBackend): + def test_none_values_handled_correctly(self, backend: TantivyBackend) -> None: """Document fields with None values must not cause indexing errors.""" doc = Document.objects.create( title="Test Doc", @@ -464,7 +470,10 @@ class TestFieldHandling: assert len(backend.search_ids("test", user=None)) == 1 - def test_custom_fields_include_name_and_value(self, backend: TantivyBackend): + def test_custom_fields_include_name_and_value( + self, + backend: TantivyBackend, + ) -> None: """Custom fields must be indexed with both field name and value for structured queries.""" field = CustomField.objects.create( name="Invoice Number", @@ -486,7 +495,10 @@ class TestFieldHandling: assert len(backend.search_ids("invoice", user=None)) == 1 - def test_select_custom_field_indexes_label_not_id(self, backend: TantivyBackend): + def test_select_custom_field_indexes_label_not_id( + self, + backend: TantivyBackend, + ) -> None: """SELECT custom fields must index the human-readable label, not the opaque option ID.""" field = CustomField.objects.create( name="Category", @@ -514,7 +526,7 @@ class TestFieldHandling: assert len(backend.search_ids("custom_fields.value:invoice", user=None)) == 1 assert len(backend.search_ids("custom_fields.value:opt_abc", user=None)) == 0 - def test_none_custom_field_value_not_indexed(self, backend: TantivyBackend): + def test_none_custom_field_value_not_indexed(self, backend: TantivyBackend) -> None: """Custom field instances with no value set must not produce an index entry.""" field = CustomField.objects.create( name="Optional", @@ -536,7 +548,7 @@ class TestFieldHandling: assert len(backend.search_ids("custom_fields.value:none", user=None)) == 0 - def test_notes_include_user_information(self, backend: TantivyBackend): + def test_notes_include_user_information(self, backend: TantivyBackend) -> None: """Notes must be indexed with user information when available for structured queries.""" user = User.objects.create_user("notewriter") doc = Document.objects.create( @@ -566,7 +578,7 @@ class TestHighlightHits: def test_highlights_simple_text_mode_returns_html_string( self, backend: TantivyBackend, - ): + ) -> None: """Simple text search should still produce content highlights for exact-token hits.""" doc = Document.objects.create( title="Highlight Test", @@ -583,7 +595,10 @@ class TestHighlightHits: assert "content" in highlights assert "" in highlights["content"] - def test_highlights_content_returns_html_string(self, backend: TantivyBackend): + def test_highlights_content_returns_html_string( + self, + backend: TantivyBackend, + ) -> None: """highlight_hits must return HTML strings (from Snippet.to_html()), not Snippet objects.""" doc = Document.objects.create( title="Highlight Test", @@ -607,7 +622,10 @@ class TestHighlightHits: f"Expected HTML with tags, got: {content_highlight!r}" ) - def test_highlights_notes_returns_html_string(self, backend: TantivyBackend): + def test_highlights_notes_returns_html_string( + self, + backend: TantivyBackend, + ) -> None: """Note highlights must be HTML strings via notes_text companion field. The notes JSON field does not support tantivy SnippetGenerator; the @@ -642,12 +660,12 @@ class TestHighlightHits: f"Expected HTML with tags, got: {note_highlight!r}" ) - def test_empty_doc_list_returns_empty_hits(self, backend: TantivyBackend): + def test_empty_doc_list_returns_empty_hits(self, backend: TantivyBackend) -> None: """highlight_hits with no doc IDs must return an empty list.""" hits = backend.highlight_hits("anything", []) assert hits == [] - def test_no_highlights_when_no_match(self, backend: TantivyBackend): + def test_no_highlights_when_no_match(self, backend: TantivyBackend) -> None: """Documents not matching the query should not appear in results.""" doc = Document.objects.create( title="Unrelated", diff --git a/src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py b/src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py index 739ea996c..df02e5efb 100644 --- a/src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py +++ b/src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py @@ -79,60 +79,60 @@ class TestMigrateFulltextQueryFieldPrefixes(TestMigrations): value="note:something", ) - def test_note_prefix_rewritten(self): + def test_note_prefix_rewritten(self) -> None: self.rule_note.refresh_from_db() self.assertEqual(self.rule_note.value, "notes.note:invoice") - def test_custom_field_prefix_rewritten(self): + def test_custom_field_prefix_rewritten(self) -> None: self.rule_cf.refresh_from_db() self.assertEqual(self.rule_cf.value, "custom_fields.value:amount") - def test_combined_query_rewritten(self): + def test_combined_query_rewritten(self) -> None: self.rule_combined.refresh_from_db() self.assertEqual( self.rule_combined.value, "notes.note:invoice AND custom_fields.value:total", ) - def test_parenthesized_groups(self): + def test_parenthesized_groups(self) -> None: self.rule_parens.refresh_from_db() self.assertEqual( self.rule_parens.value, "(notes.note:invoice OR notes.note:receipt)", ) - def test_plus_prefix(self): + def test_plus_prefix(self) -> None: self.rule_plus.refresh_from_db() self.assertEqual(self.rule_plus.value, "+notes.note:foo") - def test_minus_prefix(self): + def test_minus_prefix(self) -> None: self.rule_minus.refresh_from_db() self.assertEqual(self.rule_minus.value, "-notes.note:bar") - def test_boosted(self): + def test_boosted(self) -> None: self.rule_boost.refresh_from_db() self.assertEqual(self.rule_boost.value, "notes.note:test^2") - def test_no_match_unchanged(self): + def test_no_match_unchanged(self) -> None: self.rule_no_match.refresh_from_db() self.assertEqual(self.rule_no_match.value, "title:hello content:world") - def test_word_boundary_no_false_positive(self): + def test_word_boundary_no_false_positive(self) -> None: self.rule_denote.refresh_from_db() self.assertEqual(self.rule_denote.value, "denote:foo") - def test_already_migrated_idempotent(self): + def test_already_migrated_idempotent(self) -> None: self.rule_already_migrated.refresh_from_db() self.assertEqual(self.rule_already_migrated.value, "notes.note:foo") - def test_already_migrated_cf_idempotent(self): + def test_already_migrated_cf_idempotent(self) -> None: self.rule_already_migrated_cf.refresh_from_db() self.assertEqual(self.rule_already_migrated_cf.value, "custom_fields.value:bar") - def test_null_value_no_crash(self): + def test_null_value_no_crash(self) -> None: self.rule_null.refresh_from_db() self.assertIsNone(self.rule_null.value) - def test_non_fulltext_rule_untouched(self): + def test_non_fulltext_rule_untouched(self) -> None: self.rule_other_type.refresh_from_db() self.assertEqual(self.rule_other_type.value, "note:something") diff --git a/src/documents/tests/test_admin.py b/src/documents/tests/test_admin.py index 533319c2f..d4649125e 100644 --- a/src/documents/tests/test_admin.py +++ b/src/documents/tests/test_admin.py @@ -100,7 +100,7 @@ class TestTagAdmin(DirectoriesMixin, TestCase): self.tag_admin = TagAdmin(model=Tag, admin_site=AdminSite()) @patch("documents.tasks.bulk_update_documents") - def test_parent_tags_get_added(self, mock_bulk_update): + def test_parent_tags_get_added(self, mock_bulk_update) -> None: document = Document.objects.create(title="test") parent = Tag.objects.create(name="parent") child = Tag.objects.create(name="child") diff --git a/src/documents/tests/test_api_app_config.py b/src/documents/tests/test_api_app_config.py index ccefde1ad..a24b471eb 100644 --- a/src/documents/tests/test_api_app_config.py +++ b/src/documents/tests/test_api_app_config.py @@ -91,6 +91,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): - app_title and app_logo are included """ config = ApplicationConfiguration.objects.first() + assert config is not None config.app_title = "Fancy New Title" config.app_logo = "/logo/example.jpg" config.save() @@ -125,6 +126,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): ) self.assertEqual(response.status_code, status.HTTP_200_OK) config = ApplicationConfiguration.objects.first() + assert config is not None self.assertEqual(config.color_conversion_strategy, ColorConvertChoices.RGB) def test_api_update_config_empty_fields(self) -> None: @@ -150,6 +152,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): ) self.assertEqual(response.status_code, status.HTTP_200_OK) config = ApplicationConfiguration.objects.first() + assert config is not None self.assertEqual(config.user_args, None) self.assertEqual(config.language, None) self.assertEqual(config.barcode_tag_mapping, None) @@ -187,6 +190,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): self.assertIn("image/jpeg", response["Content-Type"]) config = ApplicationConfiguration.objects.first() + assert config is not None old_logo = config.app_logo self.assertTrue(Path(old_logo.path).exists()) self.client.patch( @@ -233,6 +237,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) config = ApplicationConfiguration.objects.first() + assert config is not None with Image.open(config.app_logo.path) as stored_logo: stored_exif = stored_logo.getexif() @@ -268,6 +273,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) config = ApplicationConfiguration.objects.first() + assert config is not None with Image.open(config.app_logo.path) as stored_logo: stored_text = stored_logo.text @@ -786,6 +792,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): - llm_api_key is set to None """ config = ApplicationConfiguration.objects.first() + assert config is not None config.llm_api_key = "1234567890" config.save() @@ -826,6 +833,7 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): - LLM index is triggered to update """ config = ApplicationConfiguration.objects.first() + assert config is not None config.ai_enabled = False config.llm_embedding_backend = None config.save() diff --git a/src/documents/tests/test_api_bulk_edit.py b/src/documents/tests/test_api_bulk_edit.py index 2eb68de5f..c971e0152 100644 --- a/src/documents/tests/test_api_bulk_edit.py +++ b/src/documents/tests/test_api_bulk_edit.py @@ -918,7 +918,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): ], ) - def test_api_selection_data_requires_view_permission(self): + def test_api_selection_data_requires_view_permission(self) -> None: self.doc2.owner = self.user self.doc2.save() diff --git a/src/documents/tests/test_api_custom_fields.py b/src/documents/tests/test_api_custom_fields.py index 1e1cebd7c..8ad69dd0d 100644 --- a/src/documents/tests/test_api_custom_fields.py +++ b/src/documents/tests/test_api_custom_fields.py @@ -276,7 +276,9 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): ) doc.refresh_from_db() - self.assertEqual(doc.custom_fields.first().value, None) + _cf_1 = doc.custom_fields.first() + assert _cf_1 is not None + self.assertEqual(_cf_1.value, None) @mock.patch("documents.signals.handlers.process_cf_select_update.apply_async") def test_custom_field_update_offloaded_once(self, mock_delay) -> None: @@ -567,7 +569,9 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(CustomFieldInstance.objects.count(), 1) - self.assertEqual(doc.custom_fields.first().value, "test value") + _cf_2 = doc.custom_fields.first() + assert _cf_2 is not None + self.assertEqual(_cf_2.value, "test value") # Update resp = self.client.patch( @@ -584,7 +588,9 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): ) self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(CustomFieldInstance.objects.count(), 1) - self.assertEqual(doc.custom_fields.first().value, "a new test value") + _cf_3 = doc.custom_fields.first() + assert _cf_3 is not None + self.assertEqual(_cf_3.value, "a new test value") def test_delete_custom_field_instance(self) -> None: """ @@ -650,7 +656,9 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): self.assertEqual(CustomFieldInstance.objects.count(), 1) self.assertEqual(Document.objects.count(), 1) self.assertEqual(len(doc.custom_fields.all()), 1) - self.assertEqual(doc.custom_fields.first().value, date_value) + _cf_4 = doc.custom_fields.first() + assert _cf_4 is not None + self.assertEqual(_cf_4.value, date_value) def test_custom_field_validation(self) -> None: """ @@ -1062,9 +1070,15 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(CustomFieldInstance.objects.count(), 4) - self.assertEqual(doc2.custom_fields.first().value, [1]) - self.assertEqual(doc3.custom_fields.first().value, [1]) - self.assertEqual(doc4.custom_fields.first().value, [1]) + _cf_5 = doc2.custom_fields.first() + assert _cf_5 is not None + self.assertEqual(_cf_5.value, [1]) + _cf_6 = doc3.custom_fields.first() + assert _cf_6 is not None + self.assertEqual(_cf_6.value, [1]) + _cf_7 = doc4.custom_fields.first() + assert _cf_7 is not None + self.assertEqual(_cf_7.value, [1]) # Add links appends if necessary resp = self.client.patch( @@ -1081,7 +1095,9 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): ) self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual(doc4.custom_fields.first().value, [1, 3]) + _cf_8 = doc4.custom_fields.first() + assert _cf_8 is not None + self.assertEqual(_cf_8.value, [1, 3]) # Remove one of the links, removed on other doc resp = self.client.patch( @@ -1098,9 +1114,15 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): ) self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual(doc2.custom_fields.first().value, [1]) - self.assertEqual(doc3.custom_fields.first().value, [1, 4]) - self.assertEqual(doc4.custom_fields.first().value, [3]) + _cf_9 = doc2.custom_fields.first() + assert _cf_9 is not None + self.assertEqual(_cf_9.value, [1]) + _cf_10 = doc3.custom_fields.first() + assert _cf_10 is not None + self.assertEqual(_cf_10.value, [1, 4]) + _cf_11 = doc4.custom_fields.first() + assert _cf_11 is not None + self.assertEqual(_cf_11.value, [3]) # Removes the field entirely resp = self.client.patch( @@ -1112,9 +1134,15 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): ) self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual(doc2.custom_fields.first().value, []) - self.assertEqual(doc3.custom_fields.first().value, [4]) - self.assertEqual(doc4.custom_fields.first().value, [3]) + _cf_12 = doc2.custom_fields.first() + assert _cf_12 is not None + self.assertEqual(_cf_12.value, []) + _cf_13 = doc3.custom_fields.first() + assert _cf_13 is not None + self.assertEqual(_cf_13.value, [4]) + _cf_14 = doc4.custom_fields.first() + assert _cf_14 is not None + self.assertEqual(_cf_14.value, [3]) # If field exists on target doc but value is None doc5 = Document.objects.create( @@ -1139,7 +1167,9 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): ) self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual(doc5.custom_fields.first().value, [1]) + _cf_15 = doc5.custom_fields.first() + assert _cf_15 is not None + self.assertEqual(_cf_15.value, [1]) def test_documentlink_patch_requires_change_permission_on_target_documents( self, @@ -1321,7 +1351,9 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): results = response.data["results"] self.assertEqual(results[0]["document_count"], 0) - def test_patch_document_invalid_date_custom_field_returns_validation_error(self): + def test_patch_document_invalid_date_custom_field_returns_validation_error( + self, + ) -> None: """ GIVEN: - A date custom field diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index 24165c087..36c9a0db2 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -1168,7 +1168,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): self.assertIn("all", response.data) self.assertCountEqual(response.data["all"], [d.id for d in docs]) - def test_default_ordering_uses_id_as_tiebreaker(self): + def test_default_ordering_uses_id_as_tiebreaker(self) -> None: """ GIVEN: - Documents sharing the same created date @@ -2156,7 +2156,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): match_tags, match_document_types, match_storage_paths, - ): + ) -> None: doc = Document.objects.create( title="test", mime_type="application/pdf", @@ -2193,7 +2193,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): match_document_types, match_storage_paths, mocked_load, - ): + ) -> None: """ GIVEN: - Request for suggestions for a document @@ -2276,7 +2276,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): def test_get_suggestions_dates_disabled( self, mock_get_date_parser: mock.MagicMock, - ): + ) -> None: """ GIVEN: - NUMBER_OF_SUGGESTED_DATES = 0 (disables feature) @@ -3409,7 +3409,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): ) self.assertEqual(resp.status_code, status.HTTP_200_OK) - def test_create_share_link_requires_view_permission_for_document(self): + def test_create_share_link_requires_view_permission_for_document(self) -> None: """ GIVEN: - A user with add_sharelink but without view permission on a document @@ -3457,7 +3457,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): self.assertEqual(create_resp.status_code, status.HTTP_201_CREATED) self.assertEqual(create_resp.data["document"], doc.pk) - def test_next_asn(self): + def test_next_asn(self) -> None: """ GIVEN: - Existing documents with ASNs, highest owned by user2 diff --git a/src/documents/tests/test_api_permissions.py b/src/documents/tests/test_api_permissions.py index 4f17c7781..01f4197ee 100644 --- a/src/documents/tests/test_api_permissions.py +++ b/src/documents/tests/test_api_permissions.py @@ -933,7 +933,7 @@ class TestApiUser(DirectoriesMixin, APITestCase): returned_user1 = User.objects.get(pk=user1.pk) self.assertEqual(returned_user1.is_superuser, False) - def test_only_superusers_can_create_or_alter_staff_status(self): + def test_only_superusers_can_create_or_alter_staff_status(self) -> None: """ GIVEN: - Existing user account diff --git a/src/documents/tests/test_api_schema.py b/src/documents/tests/test_api_schema.py index 876722be0..c7f9ed801 100644 --- a/src/documents/tests/test_api_schema.py +++ b/src/documents/tests/test_api_schema.py @@ -79,14 +79,14 @@ class TestApiSchema(APITestCase): class TestTasksSummarySchema: """tasks_summary_retrieve: response must be an array of TaskSummarySerializer.""" - def test_summary_response_is_array(self, api_schema: SchemaGenerator): + def test_summary_response_is_array(self, api_schema: SchemaGenerator) -> None: op = api_schema["paths"]["/api/tasks/summary/"]["get"] resp_200 = op["responses"]["200"]["content"]["application/json"]["schema"] assert resp_200["type"] == "array", ( "tasks_summary_retrieve response must be type:array" ) - def test_summary_items_have_total_count(self, api_schema: SchemaGenerator): + def test_summary_items_have_total_count(self, api_schema: SchemaGenerator) -> None: op = api_schema["paths"]["/api/tasks/summary/"]["get"] resp_200 = op["responses"]["200"]["content"]["application/json"]["schema"] items = resp_200.get("items", {}) @@ -100,7 +100,10 @@ class TestTasksSummarySchema: "summary items must have 'total_count' (TaskSummarySerializer)" ) - def test_summary_days_parameter_constraints(self, api_schema: SchemaGenerator): + def test_summary_days_parameter_constraints( + self, + api_schema: SchemaGenerator, + ) -> None: op = api_schema["paths"]["/api/tasks/summary/"]["get"] params = {p["name"]: p for p in op.get("parameters", [])} assert "days" in params, "days query parameter must be declared" @@ -112,14 +115,14 @@ class TestTasksSummarySchema: class TestTasksActiveSchema: """tasks_active_retrieve: response must be an array of TaskSerializerV10.""" - def test_active_response_is_array(self, api_schema: SchemaGenerator): + def test_active_response_is_array(self, api_schema: SchemaGenerator) -> None: op = api_schema["paths"]["/api/tasks/active/"]["get"] resp_200 = op["responses"]["200"]["content"]["application/json"]["schema"] assert resp_200["type"] == "array", ( "tasks_active_retrieve response must be type:array" ) - def test_active_items_ref_named_schema(self, api_schema: SchemaGenerator): + def test_active_items_ref_named_schema(self, api_schema: SchemaGenerator) -> None: op = api_schema["paths"]["/api/tasks/active/"]["get"] resp_200 = op["responses"]["200"]["content"]["application/json"]["schema"] items = resp_200.get("items", {}) @@ -133,7 +136,11 @@ class TestMetadataSchema: """Metadata component: array fields and optional archive fields.""" @pytest.mark.parametrize("field", ["original_metadata", "archive_metadata"]) - def test_metadata_field_is_array(self, api_schema: SchemaGenerator, field: str): + def test_metadata_field_is_array( + self, + api_schema: SchemaGenerator, + field: str, + ) -> None: props = api_schema["components"]["schemas"]["Metadata"]["properties"] assert props[field]["type"] == "array", ( f"{field} should be type:array, not type:object" @@ -144,7 +151,7 @@ class TestMetadataSchema: self, api_schema: SchemaGenerator, field: str, - ): + ) -> None: props = api_schema["components"]["schemas"]["Metadata"]["properties"] items = props[field]["items"] ref = items.get("$ref", "") @@ -166,7 +173,7 @@ class TestMetadataSchema: "archive_metadata", ], ) - def test_archive_field_not_required(self, api_schema, field): + def test_archive_field_not_required(self, api_schema, field) -> None: schema = api_schema["components"]["schemas"]["Metadata"] required = schema.get("required", []) assert field not in required @@ -179,7 +186,7 @@ class TestMetadataSchema: class TestStoragePathTestSchema: """storage_paths_test_create: response must be a string, not a StoragePath object.""" - def test_test_action_response_is_string(self, api_schema: SchemaGenerator): + def test_test_action_response_is_string(self, api_schema: SchemaGenerator) -> None: op = api_schema["paths"]["/api/storage_paths/test/"]["post"] resp_200 = op["responses"]["200"]["content"]["application/json"]["schema"] assert resp_200.get("type") == "string", ( @@ -189,7 +196,7 @@ class TestStoragePathTestSchema: def test_test_action_request_uses_storage_path_test_serializer( self, api_schema: SchemaGenerator, - ): + ) -> None: op = api_schema["paths"]["/api/storage_paths/test/"]["post"] content = ( op.get("requestBody", {}).get("content", {}).get("application/json", {}) @@ -220,11 +227,14 @@ class TestProcessedMailBulkDeleteSchema: self, api_schema: SchemaGenerator, field: str, - ): + ) -> None: props = self._get_props(api_schema) assert field in props, f"bulk_delete 200 response must have a '{field}' field" - def test_bulk_delete_response_is_not_processed_mail_serializer(self, api_schema): + def test_bulk_delete_response_is_not_processed_mail_serializer( + self, + api_schema, + ) -> None: op = api_schema["paths"]["/api/processed_mail/bulk_delete/"]["post"] resp_200 = op["responses"]["200"]["content"]["application/json"]["schema"] ref = resp_200.get("$ref", "") @@ -237,13 +247,13 @@ class TestProcessedMailBulkDeleteSchema: class TestShareLinkBundleRebuildSchema: """share_link_bundles_rebuild_create: 200 returns bundle data; 400 is documented.""" - def test_rebuild_has_400_response(self, api_schema: SchemaGenerator): + def test_rebuild_has_400_response(self, api_schema: SchemaGenerator) -> None: op = api_schema["paths"]["/api/share_link_bundles/{id}/rebuild/"]["post"] assert "400" in op["responses"], ( "rebuild must document the 400 response for 'Bundle is already being processed.'" ) - def test_rebuild_400_has_detail_field(self, api_schema: SchemaGenerator): + def test_rebuild_400_has_detail_field(self, api_schema: SchemaGenerator) -> None: op = api_schema["paths"]["/api/share_link_bundles/{id}/rebuild/"]["post"] resp_400 = op["responses"]["400"]["content"]["application/json"]["schema"] ref = resp_400.get("$ref", "") diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index 50fff3dbb..25051116b 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -943,7 +943,7 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): response = self.client.get("/api/documents/?query=things") self.assertIsNone(response.data["corrected_query"]) - def test_search_spelling_suggestion_suppressed_for_private_terms(self): + def test_search_spelling_suggestion_suppressed_for_private_terms(self) -> None: owner = User.objects.create_user("owner") attacker = User.objects.create_user("attacker") attacker.user_permissions.add( diff --git a/src/documents/tests/test_api_workflows.py b/src/documents/tests/test_api_workflows.py index a1942d746..cdd3a5f40 100644 --- a/src/documents/tests/test_api_workflows.py +++ b/src/documents/tests/test_api_workflows.py @@ -273,6 +273,7 @@ class TestApiWorkflows(DirectoriesMixin, APITestCase): self.assertEqual(Workflow.objects.count(), 2) workflow = Workflow.objects.get(name="Workflow 2") trigger = workflow.triggers.first() + assert trigger is not None self.assertSetEqual( set(trigger.filter_has_tags.values_list("id", flat=True)), {self.t1.id}, @@ -493,44 +494,24 @@ class TestApiWorkflows(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) workflow = Workflow.objects.get(id=response.data["id"]) self.assertEqual(workflow.name, "Workflow Updated") - self.assertEqual(workflow.triggers.first().filter_has_tags.first(), self.t1) + trigger = workflow.triggers.first() + assert trigger is not None + action = workflow.actions.first() + assert action is not None + self.assertEqual(trigger.filter_has_tags.first(), self.t1) + self.assertEqual(trigger.filter_has_all_tags.first(), self.t2) + self.assertEqual(trigger.filter_has_not_tags.first(), self.t3) + self.assertEqual(trigger.filter_has_any_correspondents.first(), self.c) + self.assertEqual(trigger.filter_has_not_correspondents.first(), self.c2) + self.assertEqual(trigger.filter_has_any_document_types.first(), self.dt) + self.assertEqual(trigger.filter_has_not_document_types.first(), self.dt2) + self.assertEqual(trigger.filter_has_any_storage_paths.first(), self.sp) + self.assertEqual(trigger.filter_has_not_storage_paths.first(), self.sp2) self.assertEqual( - workflow.triggers.first().filter_has_all_tags.first(), - self.t2, - ) - self.assertEqual( - workflow.triggers.first().filter_has_not_tags.first(), - self.t3, - ) - self.assertEqual( - workflow.triggers.first().filter_has_any_correspondents.first(), - self.c, - ) - self.assertEqual( - workflow.triggers.first().filter_has_not_correspondents.first(), - self.c2, - ) - self.assertEqual( - workflow.triggers.first().filter_has_any_document_types.first(), - self.dt, - ) - self.assertEqual( - workflow.triggers.first().filter_has_not_document_types.first(), - self.dt2, - ) - self.assertEqual( - workflow.triggers.first().filter_has_any_storage_paths.first(), - self.sp, - ) - self.assertEqual( - workflow.triggers.first().filter_has_not_storage_paths.first(), - self.sp2, - ) - self.assertEqual( - workflow.triggers.first().filter_custom_field_query, + trigger.filter_custom_field_query, json.dumps(["AND", [[self.cf1.id, "exact", "value"]]]), ) - self.assertEqual(workflow.actions.first().assign_title, "Action New Title") + self.assertEqual(action.assign_title, "Action New Title") def test_api_update_workflow_no_trigger_actions(self) -> None: """ @@ -612,9 +593,13 @@ class TestApiWorkflows(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) workflow = Workflow.objects.get(id=response.data["id"]) self.assertEqual(WorkflowTrigger.objects.all().count(), 1) - self.assertNotEqual(workflow.triggers.first().id, self.trigger.id) + new_trigger = workflow.triggers.first() + assert new_trigger is not None + self.assertNotEqual(new_trigger.id, self.trigger.id) self.assertEqual(WorkflowAction.objects.all().count(), 1) - self.assertNotEqual(workflow.actions.first().id, self.action.id) + new_action = workflow.actions.first() + assert new_action is not None + self.assertNotEqual(new_action.id, self.action.id) def test_email_action_validation(self) -> None: """ @@ -873,7 +858,7 @@ class TestApiWorkflows(DirectoriesMixin, APITestCase): self.action.refresh_from_db() self.assertEqual(self.action.assign_title, "Patched Title") - def test_password_action_passwords_field(self): + def test_password_action_passwords_field(self) -> None: """ GIVEN: - Nothing @@ -896,7 +881,7 @@ class TestApiWorkflows(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.data["passwords"], passwords) - def test_password_action_invalid_passwords_field(self): + def test_password_action_invalid_passwords_field(self) -> None: """ GIVEN: - Nothing diff --git a/src/documents/tests/test_barcodes.py b/src/documents/tests/test_barcodes.py index 77b1f07bb..84abcf2b1 100644 --- a/src/documents/tests/test_barcodes.py +++ b/src/documents/tests/test_barcodes.py @@ -86,7 +86,7 @@ class TestBarcode( self.assertDictEqual(separator_page_numbers, {1: False}) @override_settings(CONSUMER_ENABLE_ASN_BARCODE=True) - def test_asn_barcode_duplicate_in_trash_fails(self): + def test_asn_barcode_duplicate_in_trash_fails(self) -> None: """ GIVEN: - A document with ASN barcode 123 is in the trash @@ -585,6 +585,7 @@ class TestBarcode( - The barcode config is used """ app_config = ApplicationConfiguration.objects.first() + assert app_config is not None app_config.barcodes_enabled = True app_config.barcode_string = "CUSTOM BARCODE" app_config.save() @@ -771,6 +772,7 @@ class TestAsnBarcode(DirectoriesMixin, SampleDirMixin, GetReaderPluginMixin, Tes ) document = Document.objects.first() + assert document is not None self.assertEqual(document.archive_serial_number, 123) @@ -1059,11 +1061,15 @@ class TestTagBarcode(DirectoriesMixin, SampleDirMixin, GetReaderPluginMixin, Tes doc2 = documents[1] self.assertEqual(doc2.tags.count(), 1) - self.assertEqual(doc2.tags.first().name, "invoice") + _tag_1 = doc2.tags.first() + assert _tag_1 is not None + self.assertEqual(_tag_1.name, "invoice") doc3 = documents[2] self.assertEqual(doc3.tags.count(), 1) - self.assertEqual(doc3.tags.first().name, "receipt") + _tag_2 = doc3.tags.first() + assert _tag_2 is not None + self.assertEqual(_tag_2.name, "receipt") @override_settings( CONSUMER_ENABLE_TAG_BARCODE=True, diff --git a/src/documents/tests/test_bulk_edit.py b/src/documents/tests/test_bulk_edit.py index 0c44157a5..1b1e7550c 100644 --- a/src/documents/tests/test_bulk_edit.py +++ b/src/documents/tests/test_bulk_edit.py @@ -319,8 +319,10 @@ class TestBulkEdit(DirectoriesMixin, TestCase): [self.doc3.id], ) # assert reflect document link + _cf_1 = self.doc3.custom_fields.first() + assert _cf_1 is not None self.assertEqual( - self.doc3.custom_fields.first().value, + _cf_1.value, [self.doc2.id, self.doc1.id], ) @@ -334,14 +336,12 @@ class TestBulkEdit(DirectoriesMixin, TestCase): add_custom_fields={}, remove_custom_fields=[cf3.id], ) - self.assertNotIn( - self.doc3.id, - self.doc1.custom_fields.filter(field=cf3).first().value, - ) - self.assertNotIn( - self.doc3.id, - self.doc2.custom_fields.filter(field=cf3).first().value, - ) + _cf_2 = self.doc1.custom_fields.filter(field=cf3).first() + assert _cf_2 is not None + self.assertNotIn(self.doc3.id, _cf_2.value) + _cf_3 = self.doc2.custom_fields.filter(field=cf3).first() + assert _cf_3 is not None + self.assertNotIn(self.doc3.id, _cf_3.value) def test_modify_custom_fields_doclink_self_link(self) -> None: """ @@ -363,14 +363,12 @@ class TestBulkEdit(DirectoriesMixin, TestCase): remove_custom_fields=[], ) - self.assertEqual( - self.doc1.custom_fields.first().value, - [self.doc2.id], - ) - self.assertEqual( - self.doc2.custom_fields.first().value, - [self.doc1.id], - ) + _cf_4 = self.doc1.custom_fields.first() + assert _cf_4 is not None + self.assertEqual(_cf_4.value, [self.doc2.id]) + _cf_5 = self.doc2.custom_fields.first() + assert _cf_5 is not None + self.assertEqual(_cf_5.value, [self.doc1.id]) def test_delete(self) -> None: self.assertEqual(Document.objects.count(), 5) @@ -693,7 +691,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): self, mock_consume_file, mock_delete_documents, - ): + ) -> None: """ GIVEN: - Existing documents @@ -932,7 +930,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): mock_chord, mock_consume_file, mock_delete_documents, - ): + ) -> None: """ GIVEN: - Existing documents @@ -1027,7 +1025,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): mock_consume_file.assert_not_called() @mock.patch("documents.tasks.consume_file.apply_async") - def test_rotate(self, mock_consume_delay): + def test_rotate(self, mock_consume_delay) -> None: """ GIVEN: - Existing documents @@ -1054,7 +1052,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): self, mock_pdf_save, mock_consume_delay, - ): + ) -> None: """ GIVEN: - Existing documents @@ -1078,7 +1076,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): def test_rotate_non_pdf( self, mock_consume_delay, - ): + ) -> None: """ GIVEN: - Existing documents @@ -1105,7 +1103,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): mock_open, mock_consume_delay, mock_magic, - ): + ) -> None: Document.objects.create( checksum="B-v1", title="B version 1", @@ -1128,7 +1126,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): @mock.patch("documents.tasks.consume_file.apply_async") @mock.patch("pikepdf.Pdf.save") @mock.patch("documents.data_models.magic.from_file", return_value="application/pdf") - def test_delete_pages(self, mock_magic, mock_pdf_save, mock_consume_delay): + def test_delete_pages(self, mock_magic, mock_pdf_save, mock_consume_delay) -> None: """ GIVEN: - Existing documents @@ -1159,7 +1157,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): mock_open, mock_consume_delay, mock_magic, - ): + ) -> None: Document.objects.create( checksum="B-v1", title="B version 1", @@ -1181,7 +1179,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): @mock.patch("documents.tasks.consume_file.apply_async") @mock.patch("pikepdf.Pdf.save") - def test_delete_pages_with_error(self, mock_pdf_save, mock_consume_delay): + def test_delete_pages_with_error(self, mock_pdf_save, mock_consume_delay) -> None: """ GIVEN: - Existing documents @@ -1300,7 +1298,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): self.assertEqual(self.doc2.archive_serial_number, 333) @mock.patch("documents.tasks.consume_file.apply_async") - def test_edit_pdf_with_update_document(self, mock_consume_delay): + def test_edit_pdf_with_update_document(self, mock_consume_delay) -> None: """ GIVEN: - A single existing PDF document @@ -1338,7 +1336,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): mock_new, mock_consume_delay, mock_magic, - ): + ) -> None: Document.objects.create( checksum="B-v1", title="B version 1", @@ -1416,7 +1414,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): self, mock_consume_file, mock_group, - ): + ) -> None: """ GIVEN: - Existing document @@ -1446,7 +1444,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): mock_mkdtemp, mock_consume_delay, mock_update_document, - ): + ) -> None: doc = self.doc1 temp_dir = self.dirs.scratch_dir / "remove-password-update" temp_dir.mkdir(parents=True, exist_ok=True) diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 0ea714fc1..436408886 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -246,6 +246,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertIsNotNone(document) @@ -297,6 +298,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertIsNotNone(document) @@ -316,6 +318,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertIsNotNone(document) @@ -331,6 +334,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertIsNotNone(document) @@ -347,6 +351,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertIsNotNone(document) @@ -363,6 +368,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual(document.document_type.id, dt.id) self._assert_first_last_send_progress() @@ -377,6 +383,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual(document.storage_path.id, sp.id) self._assert_first_last_send_progress() @@ -393,6 +400,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertIn(t1, document.tags.all()) self.assertNotIn(t2, document.tags.all()) @@ -419,6 +427,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None fields_used = [ field_instance.field for field_instance in document.custom_fields.all() @@ -441,6 +450,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual(document.archive_serial_number, 123) self._assert_first_last_send_progress() @@ -460,6 +470,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None now = timezone.now() self.assertEqual(document.title, f"{c.name}{dt.name} {now.strftime('%m-%y')}") @@ -475,6 +486,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual(document.owner, testuser) self._assert_first_last_send_progress() @@ -493,6 +505,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None user_checker = ObjectPermissionChecker(testuser) self.assertTrue(user_checker.has_perm("view_document", document)) @@ -565,6 +578,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None document.delete() with self.assertRaisesMessage(ConsumerError, "document is in the trash"): @@ -645,6 +659,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual(document.title, "new docs") self.assertEqual(document.filename, "none/new docs.pdf") @@ -666,6 +681,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertIsNotNone(document) assert document is not None @@ -704,6 +720,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual(document.title, "new docs") self.assertIsNotNone(document.title) @@ -724,6 +741,7 @@ class TestConsumer( document = Document.objects.first() assert document is not None + assert document is not None self.assertEqual(document.version_label, "v1") @@ -940,6 +958,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual(document.correspondent, correspondent) self.assertEqual(document.document_type, dtype) @@ -957,6 +976,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self._assert_first_last_send_progress() @@ -987,6 +1007,7 @@ class TestConsumer( # Move the existing document to trash document = Document.objects.first() + assert document is not None document.delete() dst = self.get_test_file() @@ -1015,6 +1036,7 @@ class TestConsumer( consumer.run() document = Document.objects.first() + assert document is not None self._assert_first_last_send_progress() @@ -1173,6 +1195,7 @@ class TestConsumerCreatedDate(DirectoriesMixin, GetConsumerMixin, TestCase): consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual( document.created, @@ -1203,6 +1226,7 @@ class TestConsumerCreatedDate(DirectoriesMixin, GetConsumerMixin, TestCase): consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual( document.created, @@ -1233,6 +1257,7 @@ class TestConsumerCreatedDate(DirectoriesMixin, GetConsumerMixin, TestCase): consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual( document.created, @@ -1265,6 +1290,7 @@ class TestConsumerCreatedDate(DirectoriesMixin, GetConsumerMixin, TestCase): consumer.run() document = Document.objects.first() + assert document is not None self.assertEqual( document.created, diff --git a/src/documents/tests/test_file_handling.py b/src/documents/tests/test_file_handling.py index ba23e04c3..dc0fbb74c 100644 --- a/src/documents/tests/test_file_handling.py +++ b/src/documents/tests/test_file_handling.py @@ -1514,7 +1514,7 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase): Path("somepath/asn-201-400/asn-3xx/Does Matter.pdf"), ) - def test_template_related_context_keeps_legacy_string_coercion(self): + def test_template_related_context_keeps_legacy_string_coercion(self) -> None: """ GIVEN: - A storage path template that uses related objects directly as strings @@ -1908,7 +1908,7 @@ class TestCustomFieldFilenameUpdates( self.assertLessEqual(m.call_count, 1) @override_settings(FILENAME_FORMAT=None) - def test_overlong_storage_path_keeps_existing_filename(self): + def test_overlong_storage_path_keeps_existing_filename(self) -> None: initial_filename = generate_filename(self.doc) Document.objects.filter(pk=self.doc.pk).update(filename=str(initial_filename)) self.doc.refresh_from_db() diff --git a/src/documents/tests/test_filters.py b/src/documents/tests/test_filters.py index fa575bcd0..3e05c6ecd 100644 --- a/src/documents/tests/test_filters.py +++ b/src/documents/tests/test_filters.py @@ -83,7 +83,7 @@ class TestDateLocalization: format_style: str, locale_str: str, expected_output: str, - ): + ) -> None: """ Tests `localize_date` with `date` objects across different locales and formats. """ @@ -144,7 +144,7 @@ class TestDateLocalization: format_style: str, locale_str: str, expected_output: str, - ): + ) -> None: # To handle the non-breaking space in French and other locales result = localize_date(value, format_style, locale_str) assert result.replace("\u202f", " ") == expected_output.replace("\u202f", " ") @@ -161,7 +161,7 @@ class TestDateLocalization: def test_localize_date_raises_type_error_for_invalid_input( self, invalid_value: None | list[object] | dict[Any, Any] | Literal[1698330605], - ): + ) -> None: with pytest.raises(TypeError) as excinfo: localize_date(invalid_value, "medium", "en_US") @@ -228,7 +228,7 @@ class TestDateLocalization: format_style: str, locale_str: str, expected_output: str, - ): + ) -> None: """ Tests `localize_date` with `date` string across different locales and formats. """ @@ -289,7 +289,7 @@ class TestDateLocalization: format_style: str, locale_str: str, expected_output: str, - ): + ) -> None: """ Tests `localize_date` with `date` string across different locales and formats. """ diff --git a/src/documents/tests/test_regex.py b/src/documents/tests/test_regex.py index a55f29c3c..7085199d1 100644 --- a/src/documents/tests/test_regex.py +++ b/src/documents/tests/test_regex.py @@ -10,10 +10,10 @@ from documents.regex import validate_regex_pattern class TestValidateRegexPattern: - def test_valid_pattern(self): + def test_valid_pattern(self) -> None: validate_regex_pattern(r"\d+") - def test_invalid_pattern_raises(self): + def test_invalid_pattern_raises(self) -> None: with pytest.raises(ValueError): validate_regex_pattern(r"[invalid") @@ -40,7 +40,7 @@ class TestSafeRegexSearchAndMatch: ), ], ) - def test_match_found(self, func, pattern, text, expected_group): + def test_match_found(self, func, pattern, text, expected_group) -> None: result = func(pattern, text) assert result is not None assert result.group() == expected_group @@ -52,7 +52,7 @@ class TestSafeRegexSearchAndMatch: pytest.param(safe_regex_match, r"\d+", "abc123", id="match-no-match"), ], ) - def test_no_match(self, func, pattern, text): + def test_no_match(self, func, pattern, text) -> None: assert func(pattern, text) is None @pytest.mark.parametrize( @@ -62,7 +62,7 @@ class TestSafeRegexSearchAndMatch: pytest.param(safe_regex_match, id="match"), ], ) - def test_invalid_pattern_returns_none(self, func): + def test_invalid_pattern_returns_none(self, func) -> None: assert func(r"[invalid", "test") is None @pytest.mark.parametrize( @@ -72,7 +72,7 @@ class TestSafeRegexSearchAndMatch: pytest.param(safe_regex_match, id="match"), ], ) - def test_flags_respected(self, func): + def test_flags_respected(self, func) -> None: assert func(r"abc", "ABC", flags=regex.IGNORECASE) is not None @pytest.mark.parametrize( @@ -82,7 +82,12 @@ class TestSafeRegexSearchAndMatch: pytest.param(safe_regex_match, "match", id="match"), ], ) - def test_timeout_returns_none(self, func, method_name, mocker: MockerFixture): + def test_timeout_returns_none( + self, + func, + method_name, + mocker: MockerFixture, + ) -> None: mock_compile = mocker.patch("documents.regex.regex.compile") getattr(mock_compile.return_value, method_name).side_effect = TimeoutError assert func(r"\d+", "test") is None @@ -97,31 +102,31 @@ class TestSafeRegexSub: pytest.param(r"abc", "X", "ABC", "X", id="flags"), ], ) - def test_substitution(self, pattern, repl, text, expected): + def test_substitution(self, pattern, repl, text, expected) -> None: flags = regex.IGNORECASE if pattern == r"abc" else 0 result = safe_regex_sub(pattern, repl, text, flags=flags) assert result == expected - def test_invalid_pattern_returns_none(self): + def test_invalid_pattern_returns_none(self) -> None: assert safe_regex_sub(r"[invalid", "x", "test") is None - def test_timeout_returns_none(self, mocker: MockerFixture): + def test_timeout_returns_none(self, mocker: MockerFixture) -> None: mock_compile = mocker.patch("documents.regex.regex.compile") mock_compile.return_value.sub.side_effect = TimeoutError assert safe_regex_sub(r"\d+", "X", "test") is None class TestSafeRegexFinditer: - def test_yields_matches(self): + def test_yields_matches(self) -> None: pattern = regex.compile(r"\d+") matches = list(safe_regex_finditer(pattern, "a1b22c333")) assert [m.group() for m in matches] == ["1", "22", "333"] - def test_no_matches(self): + def test_no_matches(self) -> None: pattern = regex.compile(r"\d+") assert list(safe_regex_finditer(pattern, "abcdef")) == [] - def test_timeout_stops_iteration(self, mocker: MockerFixture): + def test_timeout_stops_iteration(self, mocker: MockerFixture) -> None: mock_pattern = mocker.MagicMock() mock_pattern.finditer.side_effect = TimeoutError mock_pattern.pattern = r"\d+" diff --git a/src/documents/tests/test_share_link_bundles.py b/src/documents/tests/test_share_link_bundles.py index 6d22d9a4e..4f0eb057e 100644 --- a/src/documents/tests/test_share_link_bundles.py +++ b/src/documents/tests/test_share_link_bundles.py @@ -280,6 +280,7 @@ class ShareLinkBundleBuildTaskTests(DirectoriesMixin, APITestCase): self.document.archive_filename = f"{self.document.pk:07}.pdf" self.document.save() path = self.document.archive_path + assert path is not None else: path = self.document.source_path path.parent.mkdir(parents=True, exist_ok=True) @@ -304,6 +305,7 @@ class ShareLinkBundleBuildTaskTests(DirectoriesMixin, APITestCase): self.assertGreater(bundle.size_bytes or 0, 0) final_path = bundle.absolute_file_path self.assertIsNotNone(final_path) + assert final_path is not None self.assertTrue(final_path.exists()) with zipfile.ZipFile(final_path) as zipf: names = zipf.namelist() @@ -327,6 +329,7 @@ class ShareLinkBundleBuildTaskTests(DirectoriesMixin, APITestCase): bundle.refresh_from_db() final_path = bundle.absolute_file_path self.assertIsNotNone(final_path) + assert final_path is not None self.assertTrue(final_path.exists()) self.assertNotEqual(final_path.read_bytes(), b"old") @@ -354,6 +357,7 @@ class ShareLinkBundleBuildTaskTests(DirectoriesMixin, APITestCase): bundle.refresh_from_db() self.assertEqual(bundle.status, ShareLinkBundle.Status.FAILED) self.assertIsInstance(bundle.last_error, dict) + assert isinstance(bundle.last_error, dict) self.assertEqual(bundle.last_error.get("message"), "zip failure") self.assertEqual(bundle.last_error.get("exception_type"), "RuntimeError") scratch_zips = list(Path(settings.SCRATCH_DIR).glob("*.zip")) diff --git a/src/documents/tests/test_task_signals.py b/src/documents/tests/test_task_signals.py index 02221743a..2c9fde16f 100644 --- a/src/documents/tests/test_task_signals.py +++ b/src/documents/tests/test_task_signals.py @@ -56,7 +56,11 @@ def send_publish( @pytest.mark.django_db class TestBeforeTaskPublishHandler: - def test_creates_task_for_consume_file(self, consume_input_doc, consume_overrides): + def test_creates_task_for_consume_file( + self, + consume_input_doc, + consume_overrides, + ) -> None: task_id = send_publish( "documents.tasks.consume_file", (), @@ -70,18 +74,18 @@ class TestBeforeTaskPublishHandler: assert task.input_data["filename"] == "invoice.pdf" assert task.owner_id == consume_overrides.owner_id - def test_creates_task_for_train_classifier(self): + def test_creates_task_for_train_classifier(self) -> None: task_id = send_publish("documents.tasks.train_classifier", (), {}) task = PaperlessTask.objects.get(task_id=task_id) assert task.task_type == PaperlessTask.TaskType.TRAIN_CLASSIFIER assert task.trigger_source == PaperlessTask.TriggerSource.MANUAL - def test_creates_task_for_sanity_check(self): + def test_creates_task_for_sanity_check(self) -> None: task_id = send_publish("documents.tasks.sanity_check", (), {}) task = PaperlessTask.objects.get(task_id=task_id) assert task.task_type == PaperlessTask.TaskType.SANITY_CHECK - def test_creates_task_for_process_mail_accounts(self): + def test_creates_task_for_process_mail_accounts(self) -> None: task_id = send_publish( "paperless_mail.tasks.process_mail_accounts", (), @@ -91,13 +95,13 @@ class TestBeforeTaskPublishHandler: assert task.task_type == PaperlessTask.TaskType.MAIL_FETCH assert task.input_data["account_ids"] == [1, 2] - def test_mail_fetch_no_account_ids_stores_empty_input(self): + def test_mail_fetch_no_account_ids_stores_empty_input(self) -> None: """Beat-scheduled mail checks pass no account_ids; input_data should be {} not {"account_ids": None}.""" task_id = send_publish("paperless_mail.tasks.process_mail_accounts", (), {}) task = PaperlessTask.objects.get(task_id=task_id) assert task.input_data == {} - def test_overrides_date_serialized_as_iso_string(self, consume_input_doc): + def test_overrides_date_serialized_as_iso_string(self, consume_input_doc) -> None: """A datetime.date in overrides is stored as an ISO string so input_data is JSON-safe.""" overrides = DocumentMetadataOverrides(created=datetime.date(2024, 1, 15)) @@ -110,7 +114,7 @@ class TestBeforeTaskPublishHandler: task = PaperlessTask.objects.get(task_id=task_id) assert task.input_data["overrides"]["created"] == "2024-01-15" - def test_overrides_path_serialized_as_string(self, consume_input_doc): + def test_overrides_path_serialized_as_string(self, consume_input_doc) -> None: """A Path value in overrides is stored as a plain string so input_data is JSON-safe.""" overrides = DocumentMetadataOverrides() overrides.filename = Path("/uploads/invoice.pdf") # type: ignore[assignment] @@ -159,11 +163,11 @@ class TestBeforeTaskPublishHandler: task = PaperlessTask.objects.get(task_id=task_id) assert task.trigger_source == expected_trigger_source - def test_ignores_untracked_task(self): + def test_ignores_untracked_task(self) -> None: send_publish("documents.tasks.some_untracked_task", (), {}) assert PaperlessTask.objects.count() == 0 - def test_ignores_none_headers(self): + def test_ignores_none_headers(self) -> None: before_task_publish_handler(sender=None, headers=None, body=None) assert PaperlessTask.objects.count() == 0 @@ -185,7 +189,7 @@ class TestBeforeTaskPublishHandler: @pytest.mark.django_db class TestTaskPrerunHandler: - def test_marks_task_started(self): + def test_marks_task_started(self) -> None: task = PaperlessTaskFactory(status=PaperlessTask.Status.PENDING) task_prerun_handler(task_id=task.task_id) @@ -215,7 +219,7 @@ class TestTaskPostrunHandler: date_started=timezone.now(), ) - def test_records_success_with_dict_result(self): + def test_records_success_with_dict_result(self) -> None: task = self._started_task() task_postrun_handler( @@ -230,7 +234,7 @@ class TestTaskPostrunHandler: assert task.duration_seconds is not None assert task.wait_time_seconds is not None - def test_skips_failure_state(self): + def test_skips_failure_state(self) -> None: """postrun skips FAILURE; task_failure_handler owns that path.""" task = self._started_task() @@ -238,7 +242,7 @@ class TestTaskPostrunHandler: task.refresh_from_db() assert task.status == PaperlessTask.Status.STARTED - def test_records_success_with_consume_result(self): + def test_records_success_with_consume_result(self) -> None: """ConsumeFileSuccessResult dict is stored directly as result_data.""" from documents.data_models import ConsumeFileSuccessResult @@ -251,7 +255,7 @@ class TestTaskPostrunHandler: task.refresh_from_db() assert task.result_data == {"document_id": 42} - def test_records_stopped_with_reason(self): + def test_records_stopped_with_reason(self) -> None: """ConsumeFileStoppedResult dict is stored directly as result_data.""" from documents.data_models import ConsumeFileStoppedResult @@ -264,14 +268,14 @@ class TestTaskPostrunHandler: task.refresh_from_db() assert task.result_data == {"reason": "Barcode splitting complete!"} - def test_none_retval_stores_no_result_data(self): + def test_none_retval_stores_no_result_data(self) -> None: """None return value (non-consume tasks) leaves result_data untouched.""" task = self._started_task() task_postrun_handler(task_id=task.task_id, retval=None, state="SUCCESS") task.refresh_from_db() assert task.result_data is None - def test_ignores_unknown_task_id(self): + def test_ignores_unknown_task_id(self) -> None: task_postrun_handler( task_id="nonexistent", @@ -279,7 +283,7 @@ class TestTaskPostrunHandler: state="SUCCESS", ) # must not raise - def test_records_revoked_state(self): + def test_records_revoked_state(self) -> None: task = self._started_task() task_postrun_handler(task_id=task.task_id, retval=None, state="REVOKED") @@ -289,7 +293,7 @@ class TestTaskPostrunHandler: @pytest.mark.django_db class TestTaskFailureHandler: - def test_records_failure_with_exception(self): + def test_records_failure_with_exception(self) -> None: task = PaperlessTaskFactory( task_type=PaperlessTask.TaskType.CONSUME_FILE, @@ -308,7 +312,7 @@ class TestTaskFailureHandler: assert task.result_data["error_message"] == "PDF parse failed" assert task.date_done is not None - def test_records_traceback_when_provided(self): + def test_records_traceback_when_provided(self) -> None: task = PaperlessTaskFactory( task_type=PaperlessTask.TaskType.CONSUME_FILE, @@ -331,7 +335,7 @@ class TestTaskFailureHandler: assert "traceback" in task.result_data assert len(task.result_data["traceback"]) <= 5000 - def test_computes_duration_and_wait_time(self): + def test_computes_duration_and_wait_time(self) -> None: now = timezone.now() task = PaperlessTaskFactory( @@ -350,14 +354,14 @@ class TestTaskFailureHandler: assert task.duration_seconds == pytest.approx(5.0, abs=1.0) assert task.wait_time_seconds == pytest.approx(5.0, abs=1.0) - def test_ignores_none_task_id(self): + def test_ignores_none_task_id(self) -> None: task_failure_handler(task_id=None, exception=ValueError("x"), traceback=None) @pytest.mark.django_db class TestTaskRevokedHandler: - def test_marks_task_revoked(self, mocker: pytest_mock.MockerFixture): + def test_marks_task_revoked(self, mocker: pytest_mock.MockerFixture) -> None: """task_revoked_handler moves a queued task to REVOKED and stamps date_done.""" task = PaperlessTaskFactory(status=PaperlessTask.Status.PENDING) request = mocker.MagicMock() @@ -368,12 +372,12 @@ class TestTaskRevokedHandler: assert task.status == PaperlessTask.Status.REVOKED assert task.date_done is not None - def test_ignores_none_request(self): + def test_ignores_none_request(self) -> None: """task_revoked_handler must not raise when request is None.""" task_revoked_handler(request=None) # must not raise - def test_ignores_unknown_task_id(self, mocker: pytest_mock.MockerFixture): + def test_ignores_unknown_task_id(self, mocker: pytest_mock.MockerFixture) -> None: """task_revoked_handler must not raise for a task_id not in the database.""" request = mocker.MagicMock() request.id = "nonexistent-id" diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index 538a70255..f28b78857 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -187,6 +187,7 @@ class TestWorkflows( ) document = Document.objects.first() + assert document is not None self.assertEqual(document.correspondent, self.c) self.assertEqual(document.document_type, self.dt) self.assertEqual(list(document.tags.all()), [self.t1, self.t2, self.t3]) @@ -298,6 +299,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertEqual(document.correspondent, self.c) self.assertEqual(document.document_type, self.dt) self.assertEqual(list(document.tags.all()), [self.t1, self.t2, self.t3]) @@ -415,6 +417,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None # workflow 1 self.assertEqual(document.document_type, self.dt) # workflow 2 @@ -483,6 +486,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertEqual(document.title, "Doc fnmatch title") expected_str = f"Document matched {trigger} from {w}" @@ -535,6 +539,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertIsNone(document.correspondent) self.assertIsNone(document.document_type) self.assertEqual(document.tags.all().count(), 0) @@ -547,7 +552,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual(get_groups_with_perms(document).count(), 0) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual( get_users_with_perms( document, @@ -555,7 +561,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual(get_groups_with_perms(document).count(), 0) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual(document.title, "simple") expected_str = f"Document did not match {w}" @@ -609,6 +616,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertIsNone(document.correspondent) self.assertIsNone(document.document_type) self.assertEqual(document.tags.all().count(), 0) @@ -621,12 +629,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual( get_users_with_perms( document, @@ -634,12 +638,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual(document.title, "simple") expected_str = f"Document did not match {w}" @@ -696,6 +696,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertIsNone(document.correspondent) self.assertIsNone(document.document_type) self.assertEqual(document.tags.all().count(), 0) @@ -708,12 +709,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual( get_users_with_perms( document, @@ -721,12 +718,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual(document.title, "simple") expected_str = f"Document did not match {w}" @@ -780,6 +773,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertIsNone(document.correspondent) self.assertIsNone(document.document_type) self.assertEqual(document.tags.all().count(), 0) @@ -792,12 +786,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual( get_users_with_perms( document, @@ -805,12 +795,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual(document.title, "simple") expected_str = f"Document did not match {w}" @@ -898,6 +884,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertEqual( list(document.custom_fields.all().values_list("field", flat=True)), [self.cf1.pk], @@ -1968,6 +1955,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertRegex( document.title, r"Doc added in \w{3,}", @@ -2994,6 +2982,7 @@ class TestWorkflows( ) document = Document.objects.first() + assert document is not None self.assertIsNone(document.correspondent) self.assertIsNone(document.document_type) @@ -3116,6 +3105,7 @@ class TestWorkflows( None, ) document = Document.objects.first() + assert document is not None self.assertIsNone(document.correspondent) self.assertIsNone(document.document_type) self.assertEqual(document.tags.all().count(), 0) @@ -3129,12 +3119,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual( get_users_with_perms( document, @@ -3142,12 +3128,8 @@ class TestWorkflows( ).count(), 0, ) - self.assertEqual( - get_groups_with_perms( - document, - ).count(), - 0, - ) + group_perms: QuerySet[Any] = get_groups_with_perms(document) + self.assertEqual(group_perms.count(), 0) self.assertEqual( document.custom_fields.all() .values_list( @@ -3216,7 +3198,10 @@ class TestWorkflows( PAPERLESS_URL="http://localhost:8000", ) @mock.patch("django.core.mail.message.EmailMessage.send") - def test_workflow_assignment_then_email_includes_attachment(self, mock_email_send): + def test_workflow_assignment_then_email_includes_attachment( + self, + mock_email_send, + ) -> None: """ GIVEN: - Workflow with assignment and email actions @@ -3765,7 +3750,7 @@ class TestWorkflows( def test_workflow_webhook_action_does_not_overwrite_concurrent_tags( self, mock_execute_webhook_action, - ): + ) -> None: """ GIVEN: - A document updated workflow with only a webhook action @@ -3819,7 +3804,7 @@ class TestWorkflows( def test_workflow_tag_actions_do_not_overwrite_concurrent_tags( self, mock_execute_webhook_action, - ): + ) -> None: """ GIVEN: - A document updated workflow that clears tags and assigns an inbox tag @@ -4097,7 +4082,7 @@ class TestWorkflows( def test_password_removal_action_attempts_multiple_passwords( self, mock_remove_password, - ): + ) -> None: """ GIVEN: - Workflow password removal action @@ -4151,7 +4136,7 @@ class TestWorkflows( def test_password_removal_action_fails_without_correct_password( self, mock_remove_password, - ): + ) -> None: """ GIVEN: - Workflow password removal action @@ -4184,7 +4169,7 @@ class TestWorkflows( def test_password_removal_action_skips_without_passwords( self, mock_remove_password, - ): + ) -> None: """ GIVEN: - Workflow password removal action with no passwords @@ -4216,7 +4201,7 @@ class TestWorkflows( def test_password_removal_consumable_document_deferred( self, mock_remove_password, - ): + ) -> None: """ GIVEN: - Workflow password removal action @@ -4283,7 +4268,7 @@ class TestWorkflows( ) assert mock_remove_password.call_count == 2 - def test_workflow_trash_action_soft_delete(self): + def test_workflow_trash_action_soft_delete(self) -> None: """ GIVEN: - Document updated workflow with delete action @@ -4326,7 +4311,7 @@ class TestWorkflows( PAPERLESS_URL="http://localhost:8000", ) @mock.patch("django.core.mail.message.EmailMessage.send") - def test_workflow_trash_with_email_action(self, mock_email_send): + def test_workflow_trash_with_email_action(self, mock_email_send) -> None: """ GIVEN: - Workflow with email action, then move to trash action @@ -4381,7 +4366,7 @@ class TestWorkflows( PAPERLESS_URL="http://localhost:8000", ) @mock.patch("documents.workflows.webhooks.send_webhook.apply_async") - def test_workflow_trash_with_webhook_action(self, mock_webhook_delay): + def test_workflow_trash_with_webhook_action(self, mock_webhook_delay) -> None: """ GIVEN: - Workflow with webhook action (include_document=True), then move to trash action @@ -4514,7 +4499,7 @@ class TestWorkflows( self.assertEqual(Document.objects.count(), 0) self.assertEqual(Document.deleted_objects.count(), 1) - def test_multiple_workflows_trash_then_assignment(self): + def test_multiple_workflows_trash_then_assignment(self) -> None: """ GIVEN: - Workflow 1 (order=0) with move to trash action @@ -4583,7 +4568,7 @@ class TestWorkflows( log_output, ) - def test_workflow_delete_action_during_consumption(self): + def test_workflow_delete_action_during_consumption(self) -> None: """ GIVEN: - Workflow with consumption trigger and delete action @@ -4642,7 +4627,7 @@ class TestWorkflows( # No document should be created self.assertEqual(Document.objects.count(), 0) - def test_workflow_delete_action_during_consumption_with_assignment(self): + def test_workflow_delete_action_during_consumption_with_assignment(self) -> None: """ GIVEN: - Workflow with consumption trigger, assignment action, then delete action @@ -5156,4 +5141,5 @@ class TestDateWorkflowLocalization( None, ) document = Document.objects.first() + assert document is not None assert document.title == expected_title diff --git a/src/documents/tests/utils.py b/src/documents/tests/utils.py index 530f588e8..ad56dfce4 100644 --- a/src/documents/tests/utils.py +++ b/src/documents/tests/utils.py @@ -176,22 +176,22 @@ class FileSystemAssertsMixin: Utilities for checks various state information of the file system """ - def assertIsFile(self, path: PathLike | str) -> None: + def assertIsFile(self, path: PathLike[str] | str) -> None: self.assertTrue(Path(path).resolve().is_file(), f"File does not exist: {path}") - def assertIsNotFile(self, path: PathLike | str) -> None: + def assertIsNotFile(self, path: PathLike[str] | str) -> None: self.assertFalse(Path(path).resolve().is_file(), f"File does exist: {path}") - def assertIsDir(self, path: PathLike | str) -> None: + def assertIsDir(self, path: PathLike[str] | str) -> None: self.assertTrue(Path(path).resolve().is_dir(), f"Dir does not exist: {path}") - def assertIsNotDir(self, path: PathLike | str) -> None: + def assertIsNotDir(self, path: PathLike[str] | str) -> None: self.assertFalse(Path(path).resolve().is_dir(), f"Dir does exist: {path}") def assertFilesEqual( self, - path1: PathLike | str, - path2: PathLike | str, + path1: PathLike[str] | str, + path2: PathLike[str] | str, ) -> None: path1 = Path(path1) path2 = Path(path2) @@ -202,7 +202,7 @@ class FileSystemAssertsMixin: self.assertEqual(hash1, hash2, "File SHA256 mismatch") - def assertFileCountInDir(self, path: PathLike | str, count: int) -> None: + def assertFileCountInDir(self, path: PathLike[str] | str, count: int) -> None: path = Path(path).resolve() self.assertTrue(path.is_dir(), f"Path {path} is not a directory") files = [x for x in path.iterdir() if x.is_file()] diff --git a/src/documents/views.py b/src/documents/views.py index 217550634..e95a1008b 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -2002,7 +2002,7 @@ class DocumentViewSet( ) -class ChatStreamingSerializer(serializers.Serializer): +class ChatStreamingSerializer(serializers.Serializer[dict[str, Any]]): q = serializers.CharField(required=True) document_id = serializers.IntegerField(required=False, allow_null=True) diff --git a/src/paperless/serialisers.py b/src/paperless/serialisers.py index 92676df4e..88cb51712 100644 --- a/src/paperless/serialisers.py +++ b/src/paperless/serialisers.py @@ -89,7 +89,7 @@ class UserSerializer(PasswordValidationMixin, serializers.ModelSerializer[User]) mfa_adapter = get_mfa_adapter() return mfa_adapter.is_mfa_enabled(user) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = User fields = ( "id", @@ -149,7 +149,7 @@ class GroupSerializer(serializers.ModelSerializer[Group]): slug_field="codename", ) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = Group fields = ( "id", @@ -161,7 +161,7 @@ class GroupSerializer(serializers.ModelSerializer[Group]): class SocialAccountSerializer(serializers.ModelSerializer[SocialAccount]): name = serializers.SerializerMethodField() - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = SocialAccount fields = ( "id", @@ -195,7 +195,7 @@ class ProfileSerializer(PasswordValidationMixin, serializers.ModelSerializer[Use def get_has_usable_password(self, user: User) -> bool: return user.has_usable_password() - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = User fields = ( "email", @@ -291,6 +291,6 @@ class ApplicationConfigurationSerializer( return value - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = ApplicationConfiguration fields = "__all__" diff --git a/src/paperless/tests/parsers/test_mail_parser.py b/src/paperless/tests/parsers/test_mail_parser.py index 83d81409c..b875442ad 100644 --- a/src/paperless/tests/parsers/test_mail_parser.py +++ b/src/paperless/tests/parsers/test_mail_parser.py @@ -766,7 +766,11 @@ class TestParser: content=b"Pretend merged PDF content", ) - def test_layout_option(layout_option, expected_calls, expected_pdf_names): + def test_layout_option( + layout_option, + expected_calls, + expected_pdf_names, + ) -> None: mock_mailrule_get.return_value = mock.Mock(pdf_layout=layout_option) mail_parser.configure(ParserContext(mailrule_id=1)) mail_parser.parse( diff --git a/src/paperless/tests/parsers/test_tesseract_custom_settings.py b/src/paperless/tests/parsers/test_tesseract_custom_settings.py index 06111173d..d39c9dabf 100644 --- a/src/paperless/tests/parsers/test_tesseract_custom_settings.py +++ b/src/paperless/tests/parsers/test_tesseract_custom_settings.py @@ -44,6 +44,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas """ with override_settings(OCR_PAGES=10): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.pages = 5 instance.save() @@ -62,6 +63,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas """ with override_settings(OCR_LANGUAGE="eng+deu"): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.language = "fra+ita" instance.save() @@ -80,6 +82,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas """ with override_settings(OCR_OUTPUT_TYPE="pdfa-3"): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.output_type = OutputTypeChoices.PDF_A instance.save() @@ -100,6 +103,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas # AUTO mode with skip_text=True explicitly passed: skip_text is set with override_settings(OCR_MODE="redo"): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.mode = ModeChoices.AUTO instance.save() @@ -118,6 +122,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas # AUTO mode alone (no skip_text): no extra OCR flag is set with override_settings(OCR_MODE="redo"): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.mode = ModeChoices.AUTO instance.save() @@ -138,6 +143,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas """ with override_settings(OCR_CLEAN="clean-final"): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.unpaper_clean = CleanChoices.CLEAN instance.save() @@ -147,6 +153,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas with override_settings(OCR_CLEAN="clean-final"): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.unpaper_clean = CleanChoices.FINAL instance.save() @@ -166,6 +173,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas """ with override_settings(OCR_DESKEW=False): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.deskew = True instance.save() @@ -185,6 +193,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas with override_settings(OCR_ROTATE_PAGES=False, OCR_ROTATE_PAGES_THRESHOLD=30.0): instance = ApplicationConfiguration.objects.all().first() assert instance is not None + assert instance is not None instance.rotate_pages = True instance.rotate_pages_threshold = 15.0 instance.save() @@ -205,6 +214,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas """ with override_settings(OCR_MAX_IMAGE_PIXELS=2_000_000.0): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.max_image_pixels = 1_000_000.0 instance.save() @@ -223,6 +233,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas """ with override_settings(OCR_COLOR_CONVERSION_STRATEGY="LeaveColorUnchanged"): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.color_conversion_strategy = ColorConvertChoices.INDEPENDENT instance.save() @@ -246,6 +257,7 @@ class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCas OCR_USER_ARGS=json.dumps({"continue_on_soft_render_error": True}), ): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.user_args = {"unpaper_args": "--pre-rotate 90"} instance.save() diff --git a/src/paperless/tests/parsers/test_tesseract_parser.py b/src/paperless/tests/parsers/test_tesseract_parser.py index 32c2146b0..0c086745c 100644 --- a/src/paperless/tests/parsers/test_tesseract_parser.py +++ b/src/paperless/tests/parsers/test_tesseract_parser.py @@ -388,8 +388,10 @@ class TestParsePdf: ) assert tesseract_parser.archive_path is not None assert tesseract_parser.archive_path.is_file() + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -531,7 +533,9 @@ class TestParseImages: tesseract_parser.parse(tesseract_samples_dir / "simple-no-dpi.png", "image/png") assert tesseract_parser.archive_path is not None assert tesseract_parser.archive_path.is_file() - assert "this is a test document." in tesseract_parser.get_text().lower() + _text = tesseract_parser.get_text() + assert _text is not None + assert "this is a test document." in _text.lower() def test_no_dpi_no_fallback_raises( self, @@ -564,8 +568,10 @@ class TestParseMultiPage: ) assert tesseract_parser.archive_path is not None assert tesseract_parser.archive_path.is_file() + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -590,8 +596,10 @@ class TestParseMultiPage: "application/pdf", ) assert tesseract_parser.archive_path is not None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -606,8 +614,10 @@ class TestParseMultiPage: "application/pdf", ) assert tesseract_parser.archive_path is not None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -633,7 +643,9 @@ class TestParseMultiPage: "application/pdf", ) assert tesseract_parser.archive_path is not None - text = tesseract_parser.get_text().lower() + text = tesseract_parser.get_text() + assert text is not None + text = text.lower() assert_ordered_substrings(text, ["page 1", "page 2"]) assert "page 3" not in text @@ -659,7 +671,9 @@ class TestParseMultiPage: "application/pdf", ) assert tesseract_parser.archive_path is not None - text = tesseract_parser.get_text().lower() + text = tesseract_parser.get_text() + assert text is not None + text = text.lower() assert "page 1" in text assert "page 2" not in text assert "page 3" not in text @@ -682,8 +696,10 @@ class TestParseMultiPage: "image/tiff", ) assert tesseract_parser.archive_path is not None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -705,8 +721,10 @@ class TestParseMultiPage: shutil.copy(tesseract_samples_dir / "multi-page-images-alpha.tiff", dest) tesseract_parser.parse(dest, "image/tiff") assert tesseract_parser.archive_path is not None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -728,8 +746,10 @@ class TestParseMultiPage: shutil.copy(tesseract_samples_dir / "multi-page-images-alpha-rgb.tiff", dest) tesseract_parser.parse(dest, "image/tiff") assert tesseract_parser.archive_path is not None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -762,8 +782,10 @@ class TestSkipArchive: produce_archive=False, ) assert tesseract_parser.archive_path is None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -787,8 +809,10 @@ class TestSkipArchive: "application/pdf", ) assert tesseract_parser.archive_path is not None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3"], ) @@ -845,7 +869,9 @@ class TestSkipArchive: "application/pdf", produce_archive=produce_archive, ) - text = tesseract_parser.get_text().lower() + text = tesseract_parser.get_text() + assert text is not None + text = text.lower() assert_ordered_substrings(text, ["page 1", "page 2", "page 3"]) if expect_archive: assert tesseract_parser.archive_path is not None @@ -933,8 +959,10 @@ class TestParseMixed: ) assert tesseract_parser.archive_path is not None assert tesseract_parser.archive_path.is_file() + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 1", "page 2", "page 3", "page 4", "page 5", "page 6"], ) sidecar = (tesseract_parser.tempdir / "sidecar.txt").read_text() @@ -961,8 +989,10 @@ class TestParseMixed: ) assert tesseract_parser.archive_path is not None assert tesseract_parser.archive_path.is_file() + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), [ "this is some normal text, present on page 1 of the document.", "this is some text, but in an image, also on page 1.", @@ -997,8 +1027,10 @@ class TestParseMixed: produce_archive=False, ) assert tesseract_parser.archive_path is None + _text = tesseract_parser.get_text() + assert _text is not None assert_ordered_substrings( - tesseract_parser.get_text().lower(), + _text.lower(), ["page 4", "page 5", "page 6"], ) @@ -1058,9 +1090,11 @@ class TestParseRtl: tesseract_samples_dir / "rtl-test.pdf", "application/pdf", ) + _text = tesseract_parser.get_text() + assert _text is not None normalised = "".join( ch - for ch in unicodedata.normalize("NFKC", tesseract_parser.get_text()) + for ch in unicodedata.normalize("NFKC", _text) if unicodedata.category(ch) != "Cf" and not ch.isspace() ) assert "ةرازو" in normalised @@ -1197,7 +1231,9 @@ class TestParserFileTypes: tesseract_parser.parse(tesseract_samples_dir / filename, mime_type) assert tesseract_parser.archive_path is not None assert tesseract_parser.archive_path.is_file() - assert "this is a test document" in tesseract_parser.get_text().lower() + _text = tesseract_parser.get_text() + assert _text is not None + assert "this is a test document" in _text.lower() def test_heic( self, @@ -1206,7 +1242,9 @@ class TestParserFileTypes: ) -> None: tesseract_parser.parse(tesseract_samples_dir / "simple.heic", "image/heic") assert tesseract_parser.archive_path is not None - assert "pizza" in tesseract_parser.get_text().lower() + _text = tesseract_parser.get_text() + assert _text is not None + assert "pizza" in _text.lower() def test_gif_with_explicit_dpi( self, @@ -1216,7 +1254,9 @@ class TestParserFileTypes: tesseract_parser.settings.image_dpi = 200 tesseract_parser.parse(tesseract_samples_dir / "simple.gif", "image/gif") assert tesseract_parser.archive_path is not None - assert "this is a test document" in tesseract_parser.get_text().lower() + _text = tesseract_parser.get_text() + assert _text is not None + assert "this is a test document" in _text.lower() def test_webp_with_explicit_dpi( self, @@ -1226,9 +1266,11 @@ class TestParserFileTypes: tesseract_parser.settings.image_dpi = 72 tesseract_parser.parse(tesseract_samples_dir / "document.webp", "image/webp") assert tesseract_parser.archive_path is not None + _text = tesseract_parser.get_text() + assert _text is not None assert re.search( r"this is a ?webp document, created 11/14/2022\.", - tesseract_parser.get_text().lower(), + _text.lower(), ) diff --git a/src/paperless/tests/settings/test_environment_parsers.py b/src/paperless/tests/settings/test_environment_parsers.py index 751df7f6a..a013d795d 100644 --- a/src/paperless/tests/settings/test_environment_parsers.py +++ b/src/paperless/tests/settings/test_environment_parsers.py @@ -26,7 +26,7 @@ class TestStringToBool: pytest.param(" True ", id="whitespace_true"), ], ) - def test_true_conversion(self, true_value: str): + def test_true_conversion(self, true_value: str) -> None: """Test that various 'true' strings correctly evaluate to True.""" assert str_to_bool(true_value) is True @@ -41,18 +41,18 @@ class TestStringToBool: pytest.param(" False ", id="whitespace_false"), ], ) - def test_false_conversion(self, false_value: str): + def test_false_conversion(self, false_value: str) -> None: """Test that various 'false' strings correctly evaluate to False.""" assert str_to_bool(false_value) is False - def test_invalid_conversion(self): + def test_invalid_conversion(self) -> None: """Test that an invalid string raises a ValueError.""" with pytest.raises(ValueError, match="Cannot convert 'maybe' to a boolean\\."): str_to_bool("maybe") class TestParseDictFromString: - def test_empty_and_none_input(self): + def test_empty_and_none_input(self) -> None: """Test behavior with None or empty string input.""" assert parse_dict_from_str(None) == {} assert parse_dict_from_str("") == {} @@ -62,13 +62,13 @@ class TestParseDictFromString: # Ensure it returns a copy, not the original object assert res is not defaults - def test_basic_parsing(self): + def test_basic_parsing(self) -> None: """Test simple key-value parsing without defaults or types.""" env_str = "key1=val1, key2=val2" expected = {"key1": "val1", "key2": "val2"} assert parse_dict_from_str(env_str) == expected - def test_with_defaults(self): + def test_with_defaults(self) -> None: """Test that environment values override defaults correctly.""" defaults = {"host": "localhost", "port": 8000, "user": "default"} env_str = "port=9090, host=db.example.com" @@ -76,7 +76,7 @@ class TestParseDictFromString: result = parse_dict_from_str(env_str, defaults=defaults) assert result == expected - def test_type_casting(self): + def test_type_casting(self) -> None: """Test successful casting of values to specified types.""" env_str = "port=9090, debug=true, timeout=12.5, user=admin" type_map = {"port": int, "debug": bool, "timeout": float} @@ -84,7 +84,7 @@ class TestParseDictFromString: result = parse_dict_from_str(env_str, type_map=type_map) assert result == expected - def test_type_casting_with_defaults(self): + def test_type_casting_with_defaults(self) -> None: """Test casting when values come from both defaults and env string.""" defaults = {"port": 8000, "debug": False, "retries": 3} env_str = "port=9090, debug=true" @@ -97,7 +97,7 @@ class TestParseDictFromString: assert result == expected assert isinstance(result["retries"], int) - def test_path_casting(self, tmp_path: Path): + def test_path_casting(self, tmp_path: Path) -> None: """Test successful casting of a string to a resolved pathlib.Path object.""" # Create a dummy file to resolve against test_file = tmp_path / "test_file.txt" @@ -111,14 +111,14 @@ class TestParseDictFromString: assert isinstance(result["config_path"], Path) assert result["config_path"] == test_file.resolve() - def test_custom_separator(self): + def test_custom_separator(self) -> None: """Test parsing with a custom separator like a semicolon.""" env_str = "host=db; port=5432; user=test" expected = {"host": "db", "port": "5432", "user": "test"} result = parse_dict_from_str(env_str, separator=";") assert result == expected - def test_edge_cases_in_string(self): + def test_edge_cases_in_string(self) -> None: """Test malformed strings to ensure robustness.""" # Malformed pair 'debug' is skipped, extra comma is ignored env_str = "key=val,, debug, foo=bar" @@ -130,7 +130,7 @@ class TestParseDictFromString: expected = {"url": "postgres://user:pass@host:5432/db"} assert parse_dict_from_str(env_str) == expected - def test_casting_error_handling(self): + def test_casting_error_handling(self) -> None: """Test that a ValueError is raised for invalid casting.""" env_str = "port=not-a-number" type_map = {"port": int} @@ -142,14 +142,14 @@ class TestParseDictFromString: assert "value 'not-a-number'" in str(excinfo.value) assert "to type 'int'" in str(excinfo.value) - def test_bool_casting_error(self): + def test_bool_casting_error(self) -> None: """Test that an invalid boolean string raises a ValueError.""" env_str = "debug=maybe" type_map = {"debug": bool} with pytest.raises(ValueError, match="Error casting key 'debug'"): parse_dict_from_str(env_str, type_map=type_map) - def test_nested_key_parsing_basic(self): + def test_nested_key_parsing_basic(self) -> None: """Basic nested key parsing using dot-notation.""" env_str = "database.host=db.example.com, database.port=5432, logging.level=INFO" result = parse_dict_from_str(env_str) @@ -158,7 +158,7 @@ class TestParseDictFromString: "logging": {"level": "INFO"}, } - def test_nested_overrides_defaults_and_deepcopy(self): + def test_nested_overrides_defaults_and_deepcopy(self) -> None: """Nested env keys override defaults and defaults are deep-copied.""" defaults = {"database": {"host": "127.0.0.1", "port": 3306, "user": "default"}} env_str = "database.host=db.example.com, debug=true" @@ -176,7 +176,7 @@ class TestParseDictFromString: assert result is not defaults assert result["database"] is not defaults["database"] - def test_nested_type_casting(self): + def test_nested_type_casting(self) -> None: """Type casting for nested keys (dot-notation) should work.""" env_str = "database.host=db.example.com, database.port=5433, debug=false" type_map = {"database.port": int, "debug": bool} @@ -188,7 +188,7 @@ class TestParseDictFromString: assert result["debug"] is False assert isinstance(result["debug"], bool) - def test_nested_casting_error_message(self): + def test_nested_casting_error_message(self) -> None: """Error messages should include the full dotted key name on failure.""" env_str = "database.port=not-a-number" type_map = {"database.port": int} @@ -200,7 +200,7 @@ class TestParseDictFromString: assert "value 'not-a-number'" in msg assert "to type 'int'" in msg - def test_type_map_does_not_recast_non_string_defaults(self): + def test_type_map_does_not_recast_non_string_defaults(self) -> None: """If a default already provides a non-string value, the caster should skip it.""" defaults = {"database": {"port": 3306}} type_map = {"database.port": int} @@ -210,22 +210,22 @@ class TestParseDictFromString: class TestGetBoolFromEnv: - def test_existing_env_var(self, mocker): + def test_existing_env_var(self, mocker) -> None: """Test that an existing environment variable is read and converted.""" mocker.patch.dict(os.environ, {"TEST_VAR": "true"}) assert get_bool_from_env("TEST_VAR") is True - def test_missing_env_var_uses_default_no(self, mocker): + def test_missing_env_var_uses_default_no(self, mocker) -> None: """Test that a missing environment variable uses default 'NO' and returns False.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_bool_from_env("MISSING_VAR") is False - def test_missing_env_var_with_explicit_default(self, mocker): + def test_missing_env_var_with_explicit_default(self, mocker) -> None: """Test that a missing environment variable uses the provided default.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_bool_from_env("MISSING_VAR", default="yes") is True - def test_invalid_value_raises_error(self, mocker): + def test_invalid_value_raises_error(self, mocker) -> None: """Test that an invalid value raises ValueError (delegates to str_to_bool).""" mocker.patch.dict(os.environ, {"INVALID_VAR": "maybe"}) with pytest.raises(ValueError): @@ -243,7 +243,7 @@ class TestGetIntFromEnv: pytest.param("-999", -999, id="large_negative"), ], ) - def test_existing_env_var_valid_ints(self, mocker, env_value, expected): + def test_existing_env_var_valid_ints(self, mocker, env_value, expected) -> None: """Test that existing environment variables with valid integers return correct values.""" mocker.patch.dict(os.environ, {"INT_VAR": env_value}) assert get_int_from_env("INT_VAR") == expected @@ -257,12 +257,12 @@ class TestGetIntFromEnv: pytest.param(None, None, id="none_default"), ], ) - def test_missing_env_var_with_defaults(self, mocker, default, expected): + def test_missing_env_var_with_defaults(self, mocker, default, expected) -> None: """Test that missing environment variables return provided defaults.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_int_from_env("MISSING_VAR", default=default) == expected - def test_missing_env_var_no_default(self, mocker): + def test_missing_env_var_no_default(self, mocker) -> None: """Test that missing environment variable with no default returns None.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_int_from_env("MISSING_VAR") is None @@ -279,7 +279,7 @@ class TestGetIntFromEnv: pytest.param("1.0", id="decimal"), ], ) - def test_invalid_int_values_raise_error(self, mocker, invalid_value): + def test_invalid_int_values_raise_error(self, mocker, invalid_value) -> None: """Test that invalid integer values raise ValueError.""" mocker.patch.dict(os.environ, {"INVALID_INT": invalid_value}) with pytest.raises(ValueError): @@ -300,7 +300,7 @@ class TestGetFloatFromEnv: pytest.param("-1.23e4", -12300.0, id="sci_large"), ], ) - def test_existing_env_var_valid_floats(self, mocker, env_value, expected): + def test_existing_env_var_valid_floats(self, mocker, env_value, expected) -> None: """Test that existing environment variables with valid floats return correct values.""" mocker.patch.dict(os.environ, {"FLOAT_VAR": env_value}) assert get_float_from_env("FLOAT_VAR") == expected @@ -314,12 +314,12 @@ class TestGetFloatFromEnv: pytest.param(None, None, id="none_default"), ], ) - def test_missing_env_var_with_defaults(self, mocker, default, expected): + def test_missing_env_var_with_defaults(self, mocker, default, expected) -> None: """Test that missing environment variables return provided defaults.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_float_from_env("MISSING_VAR", default=default) == expected - def test_missing_env_var_no_default(self, mocker): + def test_missing_env_var_no_default(self, mocker) -> None: """Test that missing environment variable with no default returns None.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_float_from_env("MISSING_VAR") is None @@ -336,7 +336,7 @@ class TestGetFloatFromEnv: pytest.param("1.2.3", id="triple_decimal"), ], ) - def test_invalid_float_values_raise_error(self, mocker, invalid_value): + def test_invalid_float_values_raise_error(self, mocker, invalid_value) -> None: """Test that invalid float values raise ValueError.""" mocker.patch.dict(os.environ, {"INVALID_FLOAT": invalid_value}) with pytest.raises(ValueError): @@ -355,19 +355,19 @@ class TestGetPathFromEnv: pytest.param("/", id="root"), ], ) - def test_existing_env_var_paths(self, mocker, env_value): + def test_existing_env_var_paths(self, mocker, env_value) -> None: """Test that existing environment variables with paths return resolved Path objects.""" mocker.patch.dict(os.environ, {"PATH_VAR": env_value}) result = get_path_from_env("PATH_VAR") assert isinstance(result, Path) assert result == Path(env_value).resolve() - def test_missing_env_var_no_default(self, mocker): + def test_missing_env_var_no_default(self, mocker) -> None: """Test that missing environment variable with no default returns None.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_path_from_env("MISSING_VAR") is None - def test_missing_env_var_with_none_default(self, mocker): + def test_missing_env_var_with_none_default(self, mocker) -> None: """Test that missing environment variable with None default returns None.""" mocker.patch.dict(os.environ, {}, clear=True) assert get_path_from_env("MISSING_VAR", default=None) is None @@ -380,7 +380,7 @@ class TestGetPathFromEnv: pytest.param(".", id="current_default"), ], ) - def test_missing_env_var_with_path_defaults(self, mocker, default_path_str): + def test_missing_env_var_with_path_defaults(self, mocker, default_path_str) -> None: """Test that missing environment variables return resolved default Path objects.""" mocker.patch.dict(os.environ, {}, clear=True) default_path = Path(default_path_str) @@ -388,7 +388,7 @@ class TestGetPathFromEnv: assert isinstance(result, Path) assert result == default_path.resolve() - def test_relative_paths_are_resolved(self, mocker): + def test_relative_paths_are_resolved(self, mocker) -> None: """Test that relative paths are properly resolved to absolute paths.""" mocker.patch.dict(os.environ, {"REL_PATH": "relative/path"}) result = get_path_from_env("REL_PATH") @@ -407,7 +407,7 @@ class TestGetListFromEnv: pytest.param("a,,b,c", ["a", "b", "c"], id="empty_elements_removed"), ], ) - def test_existing_env_var_basic_parsing(self, mocker, env_value, expected): + def test_existing_env_var_basic_parsing(self, mocker, env_value, expected) -> None: """Test that existing environment variables are parsed correctly.""" mocker.patch.dict(os.environ, {"LIST_VAR": env_value}) result = get_list_from_env("LIST_VAR") @@ -421,7 +421,7 @@ class TestGetListFromEnv: pytest.param(";", "a;b;c", ["a", "b", "c"], id="semicolon_separator"), ], ) - def test_custom_separators(self, mocker, separator, env_value, expected): + def test_custom_separators(self, mocker, separator, env_value, expected) -> None: """Test that custom separators work correctly.""" mocker.patch.dict(os.environ, {"LIST_VAR": env_value}) result = get_list_from_env("LIST_VAR", separator=separator) @@ -439,19 +439,19 @@ class TestGetListFromEnv: pytest.param(None, [], id="none_default_returns_empty_list"), ], ) - def test_missing_env_var_with_defaults(self, mocker, default, expected): + def test_missing_env_var_with_defaults(self, mocker, default, expected) -> None: """Test that missing environment variables return provided defaults.""" mocker.patch.dict(os.environ, {}, clear=True) result = get_list_from_env("MISSING_VAR", default=default) assert result == expected - def test_missing_env_var_no_default(self, mocker): + def test_missing_env_var_no_default(self, mocker) -> None: """Test that missing environment variable with no default returns empty list.""" mocker.patch.dict(os.environ, {}, clear=True) result = get_list_from_env("MISSING_VAR") assert result == [] - def test_required_env_var_missing_raises_error(self, mocker): + def test_required_env_var_missing_raises_error(self, mocker) -> None: """Test that missing required environment variable raises ValueError.""" mocker.patch.dict(os.environ, {}, clear=True) with pytest.raises( @@ -460,19 +460,19 @@ class TestGetListFromEnv: ): get_list_from_env("REQUIRED_VAR", required=True) - def test_required_env_var_with_default_does_not_raise(self, mocker): + def test_required_env_var_with_default_does_not_raise(self, mocker) -> None: """Test that required environment variable with default does not raise error.""" mocker.patch.dict(os.environ, {}, clear=True) result = get_list_from_env("REQUIRED_VAR", default=["default"], required=True) assert result == ["default"] - def test_strip_whitespace_false(self, mocker): + def test_strip_whitespace_false(self, mocker) -> None: """Test that whitespace is preserved when strip_whitespace=False.""" mocker.patch.dict(os.environ, {"LIST_VAR": " a , b , c "}) result = get_list_from_env("LIST_VAR", strip_whitespace=False) assert result == [" a ", " b ", " c "] - def test_remove_empty_false(self, mocker): + def test_remove_empty_false(self, mocker) -> None: """Test that empty elements are preserved when remove_empty=False.""" mocker.patch.dict(os.environ, {"LIST_VAR": "a,,b,,c"}) result = get_list_from_env("LIST_VAR", remove_empty=False) diff --git a/src/paperless/tests/test_celery.py b/src/paperless/tests/test_celery.py index 0c0e51272..364714b6e 100644 --- a/src/paperless/tests/test_celery.py +++ b/src/paperless/tests/test_celery.py @@ -1,6 +1,7 @@ import hmac import pickle from hashlib import sha256 +from pathlib import Path import pytest from django.test import override_settings @@ -11,21 +12,20 @@ from paperless.celery import signed_pickle_loads class TestSignedPickleSerializer: - def test_roundtrip_simple_types(self): + def test_roundtrip_simple_types(self) -> None: """Signed pickle can round-trip basic JSON-like types.""" for obj in [42, "hello", [1, 2, 3], {"key": "value"}, None, True]: assert signed_pickle_loads(signed_pickle_dumps(obj)) == obj - def test_roundtrip_complex_types(self): + def test_roundtrip_complex_types(self) -> None: """Signed pickle can round-trip types that JSON cannot.""" - from pathlib import Path obj = {"path": Path("/tmp/test"), "data": {1, 2, 3}} result = signed_pickle_loads(signed_pickle_dumps(obj)) assert result["path"] == Path("/tmp/test") assert result["data"] == {1, 2, 3} - def test_tampered_data_rejected(self): + def test_tampered_data_rejected(self) -> None: """Flipping a byte in the data portion causes HMAC failure.""" payload = signed_pickle_dumps({"task": "test"}) tampered = bytearray(payload) @@ -33,7 +33,7 @@ class TestSignedPickleSerializer: with pytest.raises(ValueError, match="HMAC verification failed"): signed_pickle_loads(bytes(tampered)) - def test_tampered_signature_rejected(self): + def test_tampered_signature_rejected(self) -> None: """Flipping a byte in the signature portion causes HMAC failure.""" payload = signed_pickle_dumps({"task": "test"}) tampered = bytearray(payload) @@ -41,17 +41,17 @@ class TestSignedPickleSerializer: with pytest.raises(ValueError, match="HMAC verification failed"): signed_pickle_loads(bytes(tampered)) - def test_truncated_payload_rejected(self): + def test_truncated_payload_rejected(self) -> None: """A payload shorter than HMAC_SIZE is rejected.""" with pytest.raises(ValueError, match="too short"): signed_pickle_loads(b"\x00" * (HMAC_SIZE - 1)) - def test_empty_payload_rejected(self): + def test_empty_payload_rejected(self) -> None: with pytest.raises(ValueError, match="too short"): signed_pickle_loads(b"") @override_settings(SECRET_KEY="different-secret-key") - def test_wrong_secret_key_rejected(self): + def test_wrong_secret_key_rejected(self) -> None: """A message signed with one key cannot be loaded with another.""" original_key = b"test-secret-key-do-not-use-in-production" obj = {"task": "test"} @@ -61,7 +61,7 @@ class TestSignedPickleSerializer: with pytest.raises(ValueError, match="HMAC verification failed"): signed_pickle_loads(payload) - def test_forged_pickle_rejected(self): + def test_forged_pickle_rejected(self) -> None: """A raw pickle payload (no signature) is rejected.""" raw_pickle = pickle.dumps({"task": "test"}) # Raw pickle won't have a valid HMAC prefix diff --git a/src/paperless/tests/test_migration_replace_skip_archive_file.py b/src/paperless/tests/test_migration_replace_skip_archive_file.py index cb31ffb35..e13bfd10c 100644 --- a/src/paperless/tests/test_migration_replace_skip_archive_file.py +++ b/src/paperless/tests/test_migration_replace_skip_archive_file.py @@ -45,45 +45,45 @@ class TestMigrateSkipArchiveFile(TestMigrations): ) return ApplicationConfiguration.objects.get(pk=pk) - def test_skip_mapped_to_auto(self): + def test_skip_mapped_to_auto(self) -> None: config = self._get_config(1) assert config.mode == "auto" - def test_skip_archive_always_mapped_to_never(self): + def test_skip_archive_always_mapped_to_never(self) -> None: config = self._get_config(1) assert config.archive_file_generation == "never" - def test_redo_unchanged(self): + def test_redo_unchanged(self) -> None: config = self._get_config(2) assert config.mode == "redo" - def test_skip_archive_with_text_mapped_to_auto(self): + def test_skip_archive_with_text_mapped_to_auto(self) -> None: config = self._get_config(2) assert config.archive_file_generation == "auto" - def test_force_unchanged(self): + def test_force_unchanged(self) -> None: config = self._get_config(3) assert config.mode == "force" - def test_skip_archive_never_mapped_to_always(self): + def test_skip_archive_never_mapped_to_always(self) -> None: config = self._get_config(3) assert config.archive_file_generation == "always" - def test_skip_noarchive_mapped_to_auto(self): + def test_skip_noarchive_mapped_to_auto(self) -> None: config = self._get_config(4) assert config.mode == "auto" - def test_skip_noarchive_implies_archive_never(self): + def test_skip_noarchive_implies_archive_never(self) -> None: config = self._get_config(4) assert config.archive_file_generation == "never" - def test_skip_noarchive_explicit_skip_archive_takes_precedence(self): + def test_skip_noarchive_explicit_skip_archive_takes_precedence(self) -> None: """skip_archive_file=never maps to always, not overridden by skip_noarchive.""" config = self._get_config(5) assert config.mode == "auto" assert config.archive_file_generation == "always" - def test_null_values_remain_null(self): + def test_null_values_remain_null(self) -> None: config = self._get_config(6) assert config.mode is None assert config.archive_file_generation is None diff --git a/src/paperless_mail/serialisers.py b/src/paperless_mail/serialisers.py index a4c3c5830..178ceea66 100644 --- a/src/paperless_mail/serialisers.py +++ b/src/paperless_mail/serialisers.py @@ -27,7 +27,7 @@ class ObfuscatedPasswordField(serializers.CharField): class MailAccountSerializer(OwnedObjectSerializer): password = ObfuscatedPasswordField() - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = MailAccount fields = [ "id", @@ -74,7 +74,7 @@ class MailRuleSerializer(OwnedObjectSerializer): assign_document_type = DocumentTypeField(allow_null=True, required=False) order = serializers.IntegerField(required=False) - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = MailRule fields = [ "id", @@ -150,7 +150,7 @@ class MailRuleSerializer(OwnedObjectSerializer): class ProcessedMailSerializer(OwnedObjectSerializer): - class Meta: + class Meta(serializers.ModelSerializer.Meta): model = ProcessedMail fields = [ "id", diff --git a/src/paperless_mail/tests/factories.py b/src/paperless_mail/tests/factories.py index 22c90da47..6c6cefcad 100644 --- a/src/paperless_mail/tests/factories.py +++ b/src/paperless_mail/tests/factories.py @@ -9,8 +9,8 @@ from paperless_mail.models import MailRule from paperless_mail.models import ProcessedMail -class MailAccountFactory(DjangoModelFactory): - class Meta: +class MailAccountFactory(DjangoModelFactory[MailAccount]): + class Meta(DjangoModelFactory.Meta): model = MailAccount name = factory.Sequence(lambda n: f"Mail Account {n}") @@ -24,8 +24,8 @@ class MailAccountFactory(DjangoModelFactory): is_token = False -class MailRuleFactory(DjangoModelFactory): - class Meta: +class MailRuleFactory(DjangoModelFactory[MailRule]): + class Meta(DjangoModelFactory.Meta): model = MailRule name = factory.Sequence(lambda n: f"Mail Rule {n}") @@ -44,8 +44,8 @@ class MailRuleFactory(DjangoModelFactory): stop_processing = False -class ProcessedMailFactory(DjangoModelFactory): - class Meta: +class ProcessedMailFactory(DjangoModelFactory[ProcessedMail]): + class Meta(DjangoModelFactory.Meta): model = ProcessedMail rule = factory.SubFactory(MailRuleFactory) diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index 48e066646..96802fa49 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -1592,7 +1592,7 @@ class TestPostConsumeAction(TestCase): mock_get_rule_action, mock_mailbox_login, mock_get_mailbox, - ): + ) -> None: mock_mailbox = mock.MagicMock() mock_get_mailbox.return_value.__enter__.return_value = mock_mailbox mock_action = mock.MagicMock() @@ -1625,7 +1625,7 @@ class TestPostConsumeAction(TestCase): mock_get_rule_action, mock_mailbox_login, mock_get_mailbox, - ): + ) -> None: mock_mailbox = mock.MagicMock() mock_get_mailbox.return_value.__enter__.return_value = mock_mailbox mock_action = mock.MagicMock() @@ -1762,7 +1762,7 @@ class TestTasks(TestCase): self.assertIn("No new", result) @mock.patch("paperless_mail.tasks.MailAccountHandler.handle_mail_account") - def test_rule_with_stop_processing(self, m): + def test_rule_with_stop_processing(self, m) -> None: """ GIVEN: - Mail account with a rule with stop_processing=True @@ -1863,7 +1863,7 @@ class TestMailAccountTestView(APITestCase): def test_mail_account_test_view_refresh_token( self, mock_refresh_account_oauth_token, - ): + ) -> None: """ GIVEN: - Mail account with expired token @@ -2050,6 +2050,7 @@ class TestMailRuleAPI(APITestCase): self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(MailRule.objects.count(), 1) rule = MailRule.objects.first() + assert rule is not None self.assertEqual(rule.name, "Test Rule") def test_mail_rule_action_parameter_required_for_tag_or_move(self) -> None: diff --git a/src/paperless_mail/tests/test_mail_oauth.py b/src/paperless_mail/tests/test_mail_oauth.py index fd891dfeb..52b96ca83 100644 --- a/src/paperless_mail/tests/test_mail_oauth.py +++ b/src/paperless_mail/tests/test_mail_oauth.py @@ -96,7 +96,7 @@ class TestMailOAuth( self, mock_get_outlook_access_token, mock_get_gmail_access_token, - ): + ) -> None: """ GIVEN: - Mocked settings for Gmail and Outlook OAuth client IDs and secrets @@ -277,7 +277,7 @@ class TestMailOAuth( self, mock_refresh_token, mock_get_mailbox, - ): + ) -> None: """ GIVEN: - Mail account with refresh token and expiration @@ -334,7 +334,7 @@ class TestMailOAuth( self, mock_refresh_token, mock_get_mailbox, - ): + ) -> None: """ GIVEN: - Mail account with refresh token and expiration