# https://beta.ruff.rs/docs/settings/
# https://beta.ruff.rs/docs/rules/
-select = ["F", "E", "W", "UP", "COM", "DJ", "EXE", "ISC", "ICN", "G201", "INP", "PIE", "RSE", "SIM", "TID", "PLC", "PLE", "RUF"]
+extend-select = ["I", "W", "UP", "COM", "DJ", "EXE", "ISC", "ICN", "G201", "INP", "PIE", "RSE", "SIM", "TID", "PLC", "PLE", "RUF"]
# TODO PTH
ignore = ["DJ001", "SIM105"]
fix = true
def ready(self):
from .signals import document_consumption_finished
- from .signals.handlers import (
- add_inbox_tags,
- set_log_entry,
- set_correspondent,
- set_document_type,
- set_tags,
- set_storage_path,
- add_to_index,
- )
+ from .signals.handlers import add_inbox_tags
+ from .signals.handlers import add_to_index
+ from .signals.handlers import set_correspondent
+ from .signals.handlers import set_document_type
+ from .signals.handlers import set_log_entry
+ from .signals.handlers import set_storage_path
+ from .signals.handlers import set_tags
document_consumption_finished.connect(add_inbox_tags)
document_consumption_finished.connect(set_correspondent)
import itertools
from django.db.models import Q
+
from documents.models import Correspondent
from documents.models import Document
from documents.models import DocumentType
from django.core.exceptions import FieldError
from django.db.utils import OperationalError
from django.db.utils import ProgrammingError
+
from documents.signals import document_consumer_declaration
from typing import Optional
from django.conf import settings
+
from documents.models import Document
from documents.models import MatchingModel
if settings.NLTK_LANGUAGE is not None and settings.NLTK_ENABLED:
import nltk
-
- from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer
+ from nltk.tokenize import word_tokenize
# Not really hacky, since it isn't private and is documented, but
# set the search path for NLTK data to the single location it should be in
from .models import FileInfo
from .models import Tag
from .parsers import DocumentParser
+from .parsers import ParseError
from .parsers import get_parser_class_for_mime_type
from .parsers import parse_date
-from .parsers import ParseError
from .signals import document_consumption_finished
from .signals import document_consumption_started
from django.conf import settings
from django.template.defaultfilters import slugify
from django.utils import timezone
+
from documents.models import Document
logger = logging.getLogger("paperless.filehandling")
from .models import StoragePath
from .models import Tag
-
CHAR_KWARGS = ["istartswith", "iendswith", "icontains", "iexact"]
ID_KWARGS = ["in", "exact"]
INT_KWARGS = ["exact", "gt", "gte", "lt", "lte", "isnull"]
from dateutil.parser import isoparse
from django.conf import settings
from django.utils import timezone
-from documents.models import Document
-from documents.models import Note
from guardian.shortcuts import get_users_with_perms
from whoosh import classify
from whoosh import highlight
from whoosh.fields import DATETIME
from whoosh.fields import KEYWORD
from whoosh.fields import NUMERIC
-from whoosh.fields import Schema
from whoosh.fields import TEXT
+from whoosh.fields import Schema
from whoosh.highlight import HtmlFormatter
from whoosh.index import create_in
from whoosh.index import exists_in
from whoosh.searching import Searcher
from whoosh.writing import AsyncWriter
+from documents.models import Document
+from documents.models import Note
+
logger = logging.getLogger("paperless.index")
from django.conf import settings
from django.core.management.base import BaseCommand
from django.core.management.base import CommandError
+
from documents.models import Document
from paperless.db import GnuPG
from django import db
from django.conf import settings
from django.core.management.base import BaseCommand
+
from documents.models import Document
from documents.tasks import update_document_archive_file
-
logger = logging.getLogger("paperless.management.archiver")
from django.conf import settings
from django.core.management.base import BaseCommand
from django.core.management.base import CommandError
+from watchdog.events import FileSystemEventHandler
+from watchdog.observers.polling import PollingObserver
+
from documents.data_models import ConsumableDocument
from documents.data_models import DocumentMetadataOverrides
from documents.data_models import DocumentSource
from documents.models import Tag
from documents.parsers import is_file_ext_supported
from documents.tasks import consume_file
-from watchdog.events import FileSystemEventHandler
-from watchdog.observers.polling import PollingObserver
try:
- from inotifyrecursive import INotify, flags
+ from inotifyrecursive import INotify
+ from inotifyrecursive import flags
except ImportError: # pragma: nocover
INotify = flags = None
from django.core.management.base import CommandError
from django.db import transaction
from django.utils import timezone
+from filelock import FileLock
+
+from documents.file_handling import delete_empty_directories
+from documents.file_handling import generate_filename
from documents.models import Correspondent
from documents.models import Document
from documents.models import DocumentType
from documents.settings import EXPORTER_ARCHIVE_NAME
from documents.settings import EXPORTER_FILE_NAME
from documents.settings import EXPORTER_THUMBNAIL_NAME
-from filelock import FileLock
from paperless import version
from paperless.db import GnuPG
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
-from documents.file_handling import delete_empty_directories
-from documents.file_handling import generate_filename
-
class Command(BaseCommand):
from django.core.serializers.base import DeserializationError
from django.db.models.signals import m2m_changed
from django.db.models.signals import post_save
+from filelock import FileLock
+
+from documents.file_handling import create_source_path_directory
from documents.models import Document
from documents.parsers import run_convert
from documents.settings import EXPORTER_ARCHIVE_NAME
from documents.settings import EXPORTER_FILE_NAME
from documents.settings import EXPORTER_THUMBNAIL_NAME
-from filelock import FileLock
-from paperless import version
-
-from documents.file_handling import create_source_path_directory
from documents.signals.handlers import update_filename_and_move_files
+from paperless import version
@contextmanager
from django.core.management import BaseCommand
from django.db import transaction
+
from documents.tasks import index_optimize
from documents.tasks import index_reindex
import tqdm
from django.core.management.base import BaseCommand
from django.db.models.signals import post_save
+
from documents.models import Document
import tqdm
from django.core.management.base import BaseCommand
+
from documents.classifier import load_classifier
from documents.models import Document
-
from documents.signals.handlers import set_correspondent
from documents.signals.handlers import set_document_type
from documents.signals.handlers import set_storage_path
from documents.signals.handlers import set_tags
-
logger = logging.getLogger("paperless.management.retagger")
from django.core.management.base import BaseCommand
+
from documents.sanity_checker import check_sanity
import tqdm
from django import db
from django.core.management.base import BaseCommand
-from documents.models import Document
+from documents.models import Document
from documents.parsers import get_parser_class_for_mime_type
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
-
logger = logging.getLogger("paperless.management.superuser")
from documents.models import Tag
from documents.permissions import get_objects_for_user_owner_aware
-
logger = logging.getLogger("paperless.matching")
# Generated by Django 1.9 on 2015-12-20 19:10
-from django.db import migrations, models
from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9 on 2015-12-26 13:16
-from django.db import migrations, models
import django.utils.timezone
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9 on 2016-01-11 12:21
-from django.db import migrations, models
-from django.template.defaultfilters import slugify
-
import django.db.models.deletion
-
+from django.db import migrations
+from django.db import models
+from django.template.defaultfilters import slugify
DOCUMENT_SENDER_MAP = {}
# Generated by Django 1.9 on 2016-01-14 18:44
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9 on 2016-01-23 04:30
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9 on 2016-01-26 21:14
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9 on 2016-01-29 22:58
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9 on 2016-02-14 00:40
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9 on 2016-02-27 17:54
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9.2 on 2016-03-05 00:40
-import gnupg
import os
import re
import shutil
import subprocess
import tempfile
+import gnupg
from django.conf import settings
from django.db import migrations
from django.utils.termcolors import colorize as colourise # Spelling hurts me
# Generated by Django 1.9.4 on 2016-03-25 21:11
-from django.db import migrations, models
import django.utils.timezone
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.9.4 on 2016-03-28 19:09
-import gnupg
import hashlib
import os
import django.utils.timezone
+import gnupg
from django.conf import settings
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
from django.template.defaultfilters import slugify
from django.utils.termcolors import colorize as colourise # Spelling hurts me
# Generated by Django 1.10.2 on 2016-10-05 21:38
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.10.5 on 2017-03-25 15:58
-from django.db import migrations, models
from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.10.5 on 2017-05-12 05:07
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 1.10.5 on 2017-07-15 17:12
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
-from django.db import migrations, models
import django.utils.timezone
+from django.db import migrations
+from django.db import models
def set_added_time_to_created_time(apps, schema_editor):
# Generated by Django 1.11.10 on 2018-02-04 13:07
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 2.0.8 on 2018-10-07 14:20
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
from django.utils.text import slugify
# Generated by Django 2.0.10 on 2019-04-26 18:57
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
def set_filename(apps, schema_editor):
# Generated by Django 3.1.3 on 2020-11-07 12:35
import uuid
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
def logs_set_default_group(apps, schema_editor):
# Generated by Django 3.1.3 on 2020-11-11 11:05
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
import magic
from django.conf import settings
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
from paperless.db import GnuPG
# Generated by Django 3.1.3 on 2020-11-29 00:48
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.4 on 2020-12-12 14:41
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.4 on 2020-12-16 17:36
-from django.db import migrations
import django.db.models.functions.text
+from django.db import migrations
class Migration(migrations.Migration):
# Generated by Django 3.1.4 on 2021-01-01 21:59
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.4 on 2021-01-01 23:40
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
+from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
import pathvalidate
from django.conf import settings
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
from django.template.defaultfilters import slugify
-from documents.file_handling import defaultdictNoStr, many_to_dictionary
-
+from documents.file_handling import defaultdictNoStr
+from documents.file_handling import many_to_dictionary
logger = logging.getLogger("paperless.migrations")
def create_archive_version(doc, retry_count=3):
- from documents.parsers import (
- get_parser_class_for_mime_type,
- DocumentParser,
- ParseError,
- )
+ from documents.parsers import DocumentParser
+ from documents.parsers import ParseError
+ from documents.parsers import get_parser_class_for_mime_type
logger.info(f"Regenerating archive document for document ID:{doc.id}")
parser_class = get_parser_class_for_mime_type(doc.mime_type)
# Generated by Django 3.1.4 on 2020-12-02 21:43
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
COLOURS_OLD = {
1: "#a6cee3",
# Generated by Django 3.1.7 on 2021-02-28 15:14
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
from django.db import migrations
-
logger = logging.getLogger("paperless.migrations")
# Generated by Django 3.1.7 on 2021-03-17 12:51
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.2.12 on 2022-03-17 11:59
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.3 on 2022-04-01 22:50
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.4 on 2022-05-02 15:56
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.4 on 2022-05-07 05:10
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
from django.conf import settings
from django.db import migrations
+
from documents.parsers import run_convert
logger = logging.getLogger("paperless.migrations")
# Generated by Django 4.0.4 on 2022-05-23 07:14
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
-from django.db import migrations, models
import django.utils.timezone
from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.6 on 2022-07-25 06:34
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.5 on 2022-08-26 16:49
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.1 on 2022-09-27 19:31
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.2 on 2022-10-17 16:31
-from django.db import migrations, models
import django.utils.timezone
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.4 on 2023-01-24 17:56
import django.core.validators
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.5 on 2023-02-03 21:53
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.4 on 2022-02-03 04:24
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.7 on 2023-02-22 00:45
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.5 on 2023-03-04 22:33
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.5 on 2023-03-15 07:10
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.5 on 2023-03-17 22:15
+import django.db.models.deletion
from django.conf import settings
from django.db import migrations
from django.db import models
-import django.db.models.deletion
class Migration(migrations.Migration):
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
+
from documents.parsers import get_default_file_extension
ALL_STATES = sorted(states.ALL_STATES)
from django.conf import settings
from django.utils import timezone
+
from documents.loggers import LoggingMixin
from documents.signals import document_consumer_declaration
from typing import Final
from django.conf import settings
-from documents.models import Document
from tqdm import tqdm
+from documents.models import Document
+
class SanityCheckMessages:
def __init__(self):
from backports import zoneinfo
import magic
from django.conf import settings
+from django.contrib.auth.models import Group
+from django.contrib.auth.models import User
from django.utils.text import slugify
from django.utils.translation import gettext as _
+from guardian.shortcuts import get_users_with_perms
from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
+from documents.permissions import get_groups_with_only_permission
+from documents.permissions import set_permissions_for_object
+
from . import bulk_edit
from .models import Correspondent
from .models import Document
from .models import DocumentType
from .models import MatchingModel
+from .models import PaperlessTask
from .models import SavedView
from .models import SavedViewFilterRule
from .models import StoragePath
from .models import Tag
from .models import UiSettings
-from .models import PaperlessTask
from .parsers import is_mime_type_supported
-from guardian.shortcuts import get_users_with_perms
-
-from django.contrib.auth.models import User
-from django.contrib.auth.models import Group
-
-from documents.permissions import get_groups_with_only_permission
-from documents.permissions import set_permissions_for_object
-
# https://www.django-rest-framework.org/api-guide/serializers/#example
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
from django.conf import settings
from django.db import transaction
from django.db.models.signals import post_save
+from filelock import FileLock
+from redis.exceptions import ConnectionError
+from whoosh.writing import AsyncWriter
+
from documents import barcodes
from documents import index
from documents import sanity_checker
from documents.parsers import DocumentParser
from documents.parsers import get_parser_class_for_mime_type
from documents.sanity_checker import SanityCheckFailedException
-from filelock import FileLock
-from redis.exceptions import ConnectionError
-from whoosh.writing import AsyncWriter
-
logger = logging.getLogger("paperless.tasks")
from django.contrib.admin.sites import AdminSite
from django.test import TestCase
from django.utils import timezone
+
from documents import index
from documents.admin import DocumentAdmin
from documents.models import Document
from backports import zoneinfo
import pytest
+from dateutil.relativedelta import relativedelta
from django.conf import settings
from django.contrib.auth.models import Group
from django.contrib.auth.models import Permission
from django.contrib.auth.models import User
from django.test import override_settings
from django.utils import timezone
-from dateutil.relativedelta import relativedelta
from rest_framework import status
+from rest_framework.test import APITestCase
+from whoosh.writing import AsyncWriter
+
from documents import bulk_edit
from documents import index
from documents.models import Correspondent
from documents.models import Document
-from documents.tests.utils import DocumentConsumeDelayMixin
from documents.models import DocumentType
from documents.models import MatchingModel
+from documents.models import Note
from documents.models import PaperlessTask
from documents.models import SavedView
from documents.models import StoragePath
from documents.models import Tag
-from documents.models import Note
from documents.tests.utils import DirectoriesMixin
+from documents.tests.utils import DocumentConsumeDelayMixin
from paperless import version
-from rest_framework.test import APITestCase
-from whoosh.writing import AsyncWriter
class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
import pytest
from django.conf import settings
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+from PIL import Image
+
from documents import barcodes
from documents import tasks
from documents.consumer import ConsumerError
from documents.data_models import DocumentSource
from documents.tests.utils import DirectoriesMixin
from documents.tests.utils import FileSystemAssertsMixin
-from PIL import Image
try:
import zxingcpp # noqa: F401
from unittest import mock
from django.core.checks import Error
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from documents.checks import changed_password_check
from documents.checks import parser_check
from documents.models import Document
import pytest
from django.conf import settings
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from documents.classifier import ClassifierModelCorruptError
from documents.classifier import DocumentClassifier
from documents.classifier import IncompatibleClassifierVersionError
from backports import zoneinfo
from django.conf import settings
-from django.utils import timezone
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+from django.utils import timezone
from documents.consumer import Consumer
from documents.consumer import ConsumerError
from documents.parsers import DocumentParser
from documents.parsers import ParseError
from documents.tasks import sanity_check
-from .utils import DirectoriesMixin
from documents.tests.utils import FileSystemAssertsMixin
+from .utils import DirectoriesMixin
+
class TestAttributes(TestCase):
from dateutil import tz
from django.conf import settings
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from documents.parsers import parse_date
from documents.parsers import parse_date_generator
except ImportError:
from backports import zoneinfo
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
from django.utils import timezone
from documents.models import Correspondent
from django.conf import settings
from django.contrib.auth.models import User
from django.db import DatabaseError
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
from django.utils import timezone
from documents.file_handling import create_source_path_directory
-from django.core.management.base import CommandError
-from django.test import TestCase
-from documents.settings import EXPORTER_FILE_NAME
-from documents.settings import EXPORTER_ARCHIVE_NAME
-from pathlib import Path
import tempfile
+from pathlib import Path
+
from django.core.management import call_command
+from django.core.management.base import CommandError
+from django.test import TestCase
from documents.management.commands.document_importer import Command
+from documents.settings import EXPORTER_ARCHIVE_NAME
+from documents.settings import EXPORTER_FILE_NAME
class TestImporter(TestCase):
from unittest import mock
from django.test import TestCase
+
from documents import index
from documents.models import Document
from documents.tests.utils import DirectoriesMixin
from unittest import mock
from django.core.management import call_command
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from documents.file_handling import generate_filename
from documents.models import Document
from documents.tasks import update_document_archive_file
from documents.tests.utils import DirectoriesMixin
from documents.tests.utils import FileSystemAssertsMixin
-
sample_file = os.path.join(os.path.dirname(__file__), "samples", "simple.pdf")
from unittest import mock
from django.conf import settings
-from django.core.management import call_command
from django.core.management import CommandError
-from django.test import override_settings
+from django.core.management import call_command
from django.test import TransactionTestCase
+from django.test import override_settings
+
from documents.consumer import ConsumerError
from documents.data_models import ConsumableDocument
from documents.management.commands import document_consumer
from django.core.management import call_command
from django.core.management.base import CommandError
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
from django.utils import timezone
+
from documents.management.commands import document_exporter
from documents.models import Correspondent
from documents.models import Document
from django.core.management import call_command
from django.test import TestCase
+
from documents.models import Correspondent
from documents.models import Document
from documents.models import DocumentType
from django.contrib.auth.models import User
from django.core.management import call_command
from django.test import TestCase
+
from documents.tests.utils import DirectoriesMixin
from django.core.management import call_command
from django.test import TestCase
+
from documents.management.commands.document_thumbnails import _process_document
from documents.models import Document
from documents.tests.utils import DirectoriesMixin
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import User
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
from documents import matching
from documents.models import Correspondent
from django.conf import settings
from django.test import override_settings
+
from documents.parsers import ParseError
from documents.tests.utils import DirectoriesMixin
from documents.tests.utils import FileSystemAssertsMixin
from documents.tests.utils import TestMigrations
-
STORAGE_TYPE_GPG = "gpg"
from django.conf import settings
from django.test import override_settings
+
from documents.parsers import get_default_file_extension
from documents.tests.utils import DirectoriesMixin
from documents.tests.utils import TestMigrations
from unittest import mock
from django.test import override_settings
+
from documents.tests.utils import TestMigrations
from documents.models import Correspondent
from documents.models import Document
+
from .factories import CorrespondentFactory
from .factories import DocumentFactory
from unittest import mock
from django.apps import apps
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from documents.parsers import get_default_file_extension
from documents.parsers import get_parser_class_for_mime_type
from documents.parsers import get_supported_file_extensions
import filelock
from django.conf import settings
from django.test import TestCase
+
from documents.models import Document
from documents.sanity_checker import check_sanity
from documents.tests.utils import DirectoriesMixin
import celery
from django.test import TestCase
+
from documents.data_models import ConsumableDocument
from documents.data_models import DocumentSource
from documents.models import PaperlessTask
from documents.signals.handlers import before_task_publish_handler
+from documents.signals.handlers import task_failure_handler
from documents.signals.handlers import task_postrun_handler
from documents.signals.handlers import task_prerun_handler
-from documents.signals.handlers import task_failure_handler
from documents.tests.test_consumer import fake_magic_from_file
from documents.tests.utils import DirectoriesMixin
from django.conf import settings
from django.test import TestCase
from django.utils import timezone
+
from documents import tasks
from documents.models import Correspondent
from documents.models import Document
from django.conf import settings
from django.contrib.auth.models import User
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
from rest_framework import status
from django.apps import apps
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
-from django.test import override_settings
from django.test import TransactionTestCase
+from django.test import override_settings
+
from documents.data_models import ConsumableDocument
from documents.data_models import DocumentMetadataOverrides
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
+
from paperless.signals import handle_failed_login
django_asgi_app = get_asgi_application()
from channels.auth import AuthMiddlewareStack # noqa: E402
-from channels.routing import ProtocolTypeRouter, URLRouter # noqa: E402
+from channels.routing import ProtocolTypeRouter # noqa: E402
+from channels.routing import URLRouter # noqa: E402
from paperless.urls import websocket_urlpatterns # noqa: E402
from django.conf import settings
from django.core.checks import Error
-from django.core.checks import register
from django.core.checks import Warning
+from django.core.checks import register
exists_message = "{} is set but doesn't exist."
exists_hint = "Create a directory at {}"
from django.contrib.auth.models import Group
from django.contrib.auth.models import User
from django_filters.rest_framework import FilterSet
+
from documents.filters import CHAR_KWARGS
from django.conf import settings
+
from paperless import version
import os
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from documents.tests.utils import DirectoriesMixin
from paperless.checks import binaries_check
from paperless.checks import debug_mode_check
import datetime
import os
-from unittest import mock
from unittest import TestCase
+from unittest import mock
from celery.schedules import crontab
+
from paperless.settings import _parse_beat_schedule
from paperless.settings import _parse_ignore_dates
from paperless.settings import _parse_redis_url
from django.http import HttpRequest
from django.test import TestCase
+
from paperless.signals import handle_failed_login
from channels.layers import get_channel_layer
from channels.testing import WebsocketCommunicator
-from django.test import override_settings
from django.test import TestCase
-from paperless.asgi import application
+from django.test import override_settings
+from paperless.asgi import application
TEST_CHANNEL_LAYERS = {
"default": {
from django.utils.translation import gettext_lazy as _
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import RedirectView
+from rest_framework.authtoken import views
+from rest_framework.routers import DefaultRouter
+
from documents.views import AcknowledgeTasksView
from documents.views import BulkDownloadView
from documents.views import BulkEditView
from paperless_mail.views import MailAccountTestView
from paperless_mail.views import MailAccountViewSet
from paperless_mail.views import MailRuleViewSet
-from rest_framework.authtoken import views
-from rest_framework.routers import DefaultRouter
api_router = DefaultRouter()
api_router.register(r"correspondents", CorrespondentViewSet)
from django.http import HttpResponse
from django.views.generic import View
from django_filters.rest_framework import DjangoFilterBackend
+from rest_framework.filters import OrderingFilter
+from rest_framework.pagination import PageNumberPagination
+from rest_framework.permissions import IsAuthenticated
+from rest_framework.viewsets import ModelViewSet
+
from documents.permissions import PaperlessObjectPermissions
from paperless.filters import GroupFilterSet
from paperless.filters import UserFilterSet
from paperless.serialisers import GroupSerializer
from paperless.serialisers import UserSerializer
-from rest_framework.filters import OrderingFilter
-from rest_framework.pagination import PageNumberPagination
-from rest_framework.permissions import IsAuthenticated
-from rest_framework.viewsets import ModelViewSet
class StandardPagination(PageNumberPagination):
from django import forms
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
+
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
from paperless_mail.models import ProcessedMail
from django.apps import AppConfig
from django.conf import settings
from django.utils.translation import gettext_lazy as _
+
from paperless_mail.signals import mail_consumer_declaration
from django.db import DatabaseError
from django.utils.timezone import is_naive
from django.utils.timezone import make_aware
-from documents.data_models import ConsumableDocument
-from documents.data_models import DocumentMetadataOverrides
-from documents.data_models import DocumentSource
-from documents.loggers import LoggingMixin
-from documents.models import Correspondent
-from documents.parsers import is_mime_type_supported
-from documents.tasks import consume_file
from imap_tools import AND
+from imap_tools import NOT
from imap_tools import MailBox
from imap_tools import MailboxFolderSelectError
from imap_tools import MailBoxUnencrypted
from imap_tools import MailMessage
from imap_tools import MailMessageFlags
-from imap_tools import NOT
from imap_tools.mailbox import MailBoxTls
from imap_tools.query import LogicOperator
+
+from documents.data_models import ConsumableDocument
+from documents.data_models import DocumentMetadataOverrides
+from documents.data_models import DocumentSource
+from documents.loggers import LoggingMixin
+from documents.models import Correspondent
+from documents.parsers import is_mime_type_supported
+from documents.tasks import consume_file
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
from paperless_mail.models import ProcessedMail
from django.core.management.base import BaseCommand
+
from paperless_mail import tasks
# Generated by Django 3.1.3 on 2020-11-15 22:54
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.3 on 2020-11-18 19:40
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.3 on 2020-11-21 21:51
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.3 on 2020-11-22 10:36
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.4 on 2021-01-01 23:40
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.1.5 on 2021-01-06 01:38
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.2.3 on 2021-05-16 09:40
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.3 on 2022-03-28 17:40
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.2.12 on 2022-03-11 15:00
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 3.2.12 on 2022-03-11 16:21
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.4 on 2022-04-18 22:57
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.4 on 2022-05-29 13:21
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.0.4 on 2022-07-11 22:02
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.3 on 2022-12-06 04:48
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.5 on 2023-03-03 18:38
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
+from django.conf import settings
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.7 on 2023-03-11 21:08
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.7 on 2023-03-22 17:51
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
# Generated by Django 4.1.7 on 2023-04-20 15:03
-from django.db import migrations, models
+from django.db import migrations
+from django.db import models
class Migration(migrations.Migration):
-import documents.models as document_models
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
+import documents.models as document_models
+
class MailAccount(document_models.ModelWithOwner):
class Meta:
from django.conf import settings
from django.utils.timezone import is_naive
from django.utils.timezone import make_aware
-from documents.parsers import DocumentParser
-from documents.parsers import make_thumbnail_from_pdf
-from documents.parsers import ParseError
from humanfriendly import format_size
from imap_tools import MailMessage
from tika import parser
+from documents.parsers import DocumentParser
+from documents.parsers import ParseError
+from documents.parsers import make_thumbnail_from_pdf
+
class MailDocumentParser(DocumentParser):
"""
+from rest_framework import serializers
+
from documents.serialisers import CorrespondentField
from documents.serialisers import DocumentTypeField
from documents.serialisers import OwnedObjectSerializer
from documents.serialisers import TagsField
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
-from rest_framework import serializers
class ObfuscatedPasswordField(serializers.Field):
import logging
from celery import shared_task
+
from paperless_mail.mail import MailAccountHandler
from paperless_mail.mail import MailError
from paperless_mail.models import MailAccount
from unittest import mock
from django.contrib.auth.models import User
+from rest_framework import status
+from rest_framework.test import APITestCase
+
from documents.models import Correspondent
from documents.models import DocumentType
from documents.models import Tag
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
from paperless_mail.tests.test_mail import BogusMailBox
-from rest_framework import status
-from rest_framework.test import APITestCase
class TestAPIMailAccounts(DirectoriesMixin, APITestCase):
import pytest
from django.test import TestCase
+
from paperless_mail.mail import MailAccountHandler
from paperless_mail.mail import MailError
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
+
# Only run if the environment is setup
# And the environment is not empty (forks, I think)
@pytest.mark.skipif(
from django.core.management import call_command
from django.db import DatabaseError
from django.test import TestCase
-from documents.models import Correspondent
-from documents.tests.utils import DirectoriesMixin
-from documents.tests.utils import FileSystemAssertsMixin
+from imap_tools import NOT
from imap_tools import EmailAddress
from imap_tools import FolderInfo
from imap_tools import MailboxFolderSelectError
from imap_tools import MailboxLoginError
from imap_tools import MailMessage
from imap_tools import MailMessageFlags
-from imap_tools import NOT
+
+from documents.models import Correspondent
+from documents.tests.utils import DirectoriesMixin
+from documents.tests.utils import FileSystemAssertsMixin
from paperless_mail import tasks
-from paperless_mail.mail import apply_mail_action
from paperless_mail.mail import MailAccountHandler
from paperless_mail.mail import MailError
from paperless_mail.mail import TagMailAction
+from paperless_mail.mail import apply_mail_action
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
from unittest import mock
from django.test import TestCase
+
from documents.parsers import ParseError
from documents.tests.utils import FileSystemAssertsMixin
from paperless_mail.parsers import MailDocumentParser
import pytest
from django.test import TestCase
-from documents.parsers import run_convert
-from documents.tests.utils import FileSystemAssertsMixin
from imagehash import average_hash
-from paperless_mail.parsers import MailDocumentParser
from pdfminer.high_level import extract_text
from PIL import Image
+from documents.parsers import run_convert
+from documents.tests.utils import FileSystemAssertsMixin
+from paperless_mail.parsers import MailDocumentParser
+
class TestParserLive(FileSystemAssertsMixin, TestCase):
SAMPLE_FILES = os.path.join(os.path.dirname(__file__), "samples")
import logging
from django.http import HttpResponseBadRequest
+from rest_framework.generics import GenericAPIView
+from rest_framework.permissions import IsAuthenticated
+from rest_framework.response import Response
+from rest_framework.viewsets import ModelViewSet
+
from documents.views import PassUserMixin
from paperless.views import StandardPagination
+from paperless_mail.mail import MailError
from paperless_mail.mail import get_mailbox
from paperless_mail.mail import mailbox_login
-from paperless_mail.mail import MailError
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
from paperless_mail.serialisers import MailAccountSerializer
from paperless_mail.serialisers import MailRuleSerializer
-from rest_framework.generics import GenericAPIView
-from rest_framework.permissions import IsAuthenticated
-from rest_framework.response import Response
-from rest_framework.viewsets import ModelViewSet
class MailAccountViewSet(ModelViewSet, PassUserMixin):
from django.apps import AppConfig
+
from paperless_tesseract.signals import tesseract_consumer_declaration
from django.conf import settings
from django.core.checks import Error
-from django.core.checks import register
from django.core.checks import Warning
+from django.core.checks import register
def get_tesseract_langs():
from typing import Optional
from django.conf import settings
+from PIL import Image
+
from documents.parsers import DocumentParser
-from documents.parsers import make_thumbnail_from_pdf
from documents.parsers import ParseError
-from PIL import Image
+from documents.parsers import make_thumbnail_from_pdf
class NoTextFoundException(Exception):
# text located via OCR
import ocrmypdf
- from ocrmypdf import InputFileError, EncryptedPdfError
+ from ocrmypdf import EncryptedPdfError
+ from ocrmypdf import InputFileError
archive_path = Path(os.path.join(self.tempdir, "archive.pdf"))
sidecar_file = Path(os.path.join(self.tempdir, "sidecar.txt"))
from unittest import mock
from django.core.checks import ERROR
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from paperless_tesseract import check_default_language_available
from typing import ContextManager
from unittest import mock
-from django.test import override_settings
from django.test import TestCase
+from django.test import override_settings
+
from documents.parsers import ParseError
from documents.parsers import run_convert
from documents.tests.utils import DirectoriesMixin
from documents.tests.utils import FileSystemAssertsMixin
-from paperless_tesseract.parsers import post_process_text
from paperless_tesseract.parsers import RasterisedDocumentParser
+from paperless_tesseract.parsers import post_process_text
image_to_string_calls = []
from django.apps import AppConfig
+
from paperless_text.signals import text_consumer_declaration
import os
from django.conf import settings
-from documents.parsers import DocumentParser
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
+from documents.parsers import DocumentParser
+
class TextDocumentParser(DocumentParser):
"""
import os
from django.test import TestCase
+
from documents.tests.utils import DirectoriesMixin
from documents.tests.utils import FileSystemAssertsMixin
from paperless_text.parsers import TextDocumentParser
from django.apps import AppConfig
from django.conf import settings
+
from paperless_tika.signals import tika_consumer_declaration
import dateutil.parser
import requests
from django.conf import settings
+from tika import parser
+
from documents.parsers import DocumentParser
-from documents.parsers import make_thumbnail_from_pdf
from documents.parsers import ParseError
-from tika import parser
+from documents.parsers import make_thumbnail_from_pdf
class TikaDocumentParser(DocumentParser):
import pytest
from django.test import TestCase
+
from paperless_tika.parsers import TikaDocumentParser
from pathlib import Path
from unittest import mock
-from django.test import override_settings
from django.test import TestCase
-from documents.parsers import ParseError
-from paperless_tika.parsers import TikaDocumentParser
+from django.test import override_settings
from requests import Response
from rest_framework import status
+from documents.parsers import ParseError
+from paperless_tika.parsers import TikaDocumentParser
+
class TestTikaParser(TestCase):
def setUp(self) -> None: